Skip to content

Commit

Permalink
Update documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
markuswess committed Apr 23, 2024
1 parent 750ecac commit 16b332e
Showing 1 changed file with 344 additions and 0 deletions.
344 changes: 344 additions & 0 deletions _sources/time_integration/mixed_methods_py.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,344 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "3aa9653d",
"metadata": {},
"source": [
"# Mixed methods in NGSolve"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "44eefa62",
"metadata": {},
"outputs": [],
"source": [
"from ngsolve import *\n",
"from ngsolve.webgui import Draw"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "781071c3",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7211179e9b3848d4ac27a4ae95d392de",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"WebGuiWidget(value={'gui_settings': {}, 'ngsolve_version': '6.2.2402-37-g45ed24bde', 'mesh_dim': 2, 'order2d':…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"BaseWebGuiScene"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mesh = Mesh(unit_square.GenerateMesh(maxh=0.3))\n",
"Draw(mesh)"
]
},
{
"cell_type": "markdown",
"id": "a7932da4",
"metadata": {},
"source": [
"## Product spaces\n",
"In NGSolve spaces maybe tensorized by using the `*` symbol"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f4193eee",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"h1 dofs: 61\n",
"l2 dofs: 144\n",
"total dofs: 205 = 205\n"
]
}
],
"source": [
"order = 2\n",
"fesh1 = H1(mesh, order = order)\n",
"print(\"h1 dofs: \", fesh1.ndof)\n",
"fesl2 = VectorL2(mesh, order = order-1)\n",
"print(\"l2 dofs: \", fesl2.ndof)\n",
"\n",
"fes = fesh1*fesl2\n",
"print(\"total dofs: \", fes.ndof,\" = \", fesh1.ndof+fesl2.ndof)"
]
},
{
"cell_type": "markdown",
"id": "21f78dbb",
"metadata": {},
"source": [
"To assemble bilinear forms we need test and trial functions. From product spaces test and trial functions are returned as tuples:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9ca83c3a",
"metadata": {},
"outputs": [],
"source": [
"(p,v), (q,w) = fes.TnT()\n",
"bfgrad = BilinearForm(grad(p)*w*dx).Assemble()"
]
},
{
"cell_type": "markdown",
"id": "40449cbf",
"metadata": {},
"source": [
"The matrix is still an operator on the large space!"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "461940c7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7d8fdbca3af0>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQYAAAD8CAYAAACVSwr3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPf0lEQVR4nO3dT6ic133G8eepnXihGGzZt0LIonaCNuqiinRxBTXBJZBY2siBYuxFLIKLsrAhgWahJIt4E0gKScHQGhQsIpfUriEx1kJt44qAV3ZyFRRZsuNaSWQsIUs3dXFMA2ns/LqYM8mbOTN3Zt533vue9+r7gcvMPfPvHI/83PN7/5zXESEAqPqTrjsAoDwEA4AMwQAgQzAAyBAMADIEA4BM58Fg+x7br9k+b/tw1/2py/YF2y/bPm17JbVttv287dfT7c1d93Mtto/avmr7bKVt7Bg88Fj63s7Y3t1dzyebMKZHbV9K39Vp2/srj30xjek125/sptdrs73d9g9sv2L7nO3PpfbFfVcR0dmPpOsk/UzShyV9UNJPJO3ssk8NxnJB0q0jbX8v6XC6f1jS17vu55QxfEzSbklnp41B0n5J/ybJkvZKeqnr/s8xpkclfWHMc3emf4M3SLoj/du8rusxjOnnVkm70/0bJf1X6vvCvquuZwx3SjofET+PiP+T9LSkAx33aZEOSDqW7h+TdG93XZkuIl6Q9PZI86QxHJD0ZAy8KOkm21vXpaNzmDCmSQ5IejoifhMRv5B0XoN/o0WJiMsR8eN0/11Jr0rapgV+V10HwzZJb1Z+v5ja+igkfd/2KduHUtuWiLic7r8laUs3XWtk0hj6/t09kqbVRyslXu/GZPt2SR+V9JIW+F11HQwbyV0RsVvSPkkP2/5Y9cEYzOl6ffz5RhhD8rikj0jaJemypG902puabH9I0nclfT4iflV9rOl31XUwXJK0vfL7bamtdyLiUrq9KulZDaagV4ZTtnR7tbse1jZpDL397iLiSkS8HxG/k/Qt/aFc6M2YbH9Ag1D4TkR8LzUv7LvqOhh+JGmH7Ttsf1DS/ZKOd9ynudneZPvG4X1Jn5B0VoOxHExPOyjpuW562MikMRyX9GDa4r1X0juVaWzRRurrT2nwXUmDMd1v+wbbd0jaIemH692/aWxb0hOSXo2Ib1YeWtx3VcAW1v0abFX9maQvd92fmmP4sAZbs38i6dxwHJJukXRS0uuS/lPS5q77OmUcT2kwtf6tBnXoQ5PGoMEW7n9M39vLkpa77v8cY/rn1Ocz6X+arZXnfzmN6TVJ+7ru/4Qx3aVBmXBG0un0s3+R35XTCwHg97ouJQAUiGAAkCEYAGQIBgAZggFAprVgmPesycphxBsGY+oHxpRrJRhsX6fBftN9Gpz19YDtnVNetuG+HDGmvmBMI9qaMWz0syaBDa2VA5xs/42keyLib9Pvn5b0lxHxSOU5h5RSbdOmTXtuueUWLS0tLbwvXVpdXWVMPXCtjOnUqVO/jIiZBnp9K72aQUQckXREkpaXl2NlZaWrrgDXBNtvzPrctkqJ3pylBiDXVjBsiLMmgWtVK6VERLxn+xFJ/6HBuo5HI+JcG58FYPFa28YQEScknWjr/QG0hyMfAWQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkCEYAGQIBgAZggFAhmAAkLm+yYttX5D0rqT3Jb0XEcu2N0v6V0m3S7og6b6I+J9m3QSwnhYxY/jriNgVEcvp98OSTkbEDkkn0+8AeqSNUuKApGPp/jFJ97bwGQBa1DQYQtL3bZ+yfSi1bYmIy+n+W5K2jHuh7UO2V2yvrK6uNuwGgEVqtI1B0l0Rccn2n0p63vZPqw9GRNiOcS+MiCOSjkjS8vLy2OcA6EajGUNEXEq3VyU9K+lOSVdsb5WkdHu1aScBrK/awWB7k+0bh/clfULSWUnHJR1MTzso6bmmnQSwvpqUElskPWt7+D7/EhH/bvtHkp6x/ZCkNyTd17ybANZT7WCIiJ9L+osx7f8t6eNNOgWgWxz5CCBDMADIEAwAMgQDgAzBACDjiO4POrQd1X7YVpN+pV2oc71H088ESmf7VOVkxzUxYwCQIRgAZIoIhj179mRtw3KgjoiYuyyIiN9/ZpPPBjaCIoKhawQB8McIBgCZYoKh+ld7UXsHqqXBWrOC4edVb5lF4FpWTDAAKAfBACBTTDDMWz5MKw+q7znvXoqmZQRlCPqumGAAUA6CAUCGYACQKSYYRuvyabsMZ91mMNwWMU/dX90mUWd7ASdjoe+KCQYA5SAYAGSaXolqYSZNv9daW2FYbqw1dW+6rsNoSUOZgGsBMwYAGYIBQKaYUmKStabubR9hWC0j6pYQLBmHPmLGACBDMADIFBUM4w5ymvTY8PE60/S6BzvVfT3QN0UFw3rgzEdgumsuGABMV1QwTJt2T/pr37Q0mEf1oCdmH9ioigoGAGUgGABkCAYAmeKCYVLdvugTpepedWp0HUm2M2AjKi4YAHSPYACQKS4Y6pYFTUqCuuqWEZQfKF1xwQCgewQDgExxwTBtZehJJ1PV/awm0/q6q0lzYhVKV1wwAOgewQAgU1wwzHqhmXkvUDPpvUbXfKhbWjRZswEozdRgsH3U9lXbZyttm20/b/v1dHtzarftx2yft33G9u42Ow+gHbPMGL4t6Z6RtsOSTkbEDkkn0++StE/SjvRzSNLji+kmgPU0NRgi4gVJb480H5B0LN0/JuneSvuTMfCipJtsb523U9NWhm5r5eWmS8VVSxH2PKDP6m5j2BIRl9P9tyRtSfe3SXqz8ryLqS1j+5DtFdsrq6urNbsBoA2NNz7G4E/j3H8eI+JIRCxHxPLS0lLTbgBYoLrBcGVYIqTbq6n9kqTtlefdltoA9EjdYDgu6WC6f1DSc5X2B9Peib2S3qmUHAszrn7vcvdg3StWsUsTpZp6iTrbT0m6W9Ktti9K+oqkr0l6xvZDkt6QdF96+glJ+yWdl/RrSZ9poc8AWjY1GCLigQkPfXzMc0PSw007BaBbRR35OG5qPXo04qQjDGfZ1Vh3Obdx/RhVZ1cnuzRRqqKCAUAZCAYAmaKCYdzUepbVmGctDZos5za69sK85Qh7INAnRQUDgDIQDAAyvQmGWaf/6zFlb3KyVZM9I8B66U0wAFg/BAOATK+DoQ9rH0xaP6LkPgO9DgYA7SAYAGSmnkRVstEVo0ucnlf7NK6/bS1TBzTBjAFAhmAAkCEYAGR6GwyjS7WXVKePHt047qpZTU7oAtrW22AA0B6CAUCmyGCYdoLRcBffuGXe6k7NF3VyU7UPlAvoqyKDAUC3CAYAmSKDYdrUe60LztQtBRY17Z/3gjN1lokD2lZkMADoFsEAINPbYBh30FBJZikRSjswCxjqbTAAaA/BACDjEqaytqPaj2kHKs3yuDT/HoIS/lsAbbF9KiKWZ3kuMwYAGYIBQIZgAJApIhj27NmTta21q2/aRW7n3Q043L7AVaKAgSKCAUBZCAYAmWKCoTp9n6UMmFZOVN9z2lGI49ZPoJzAtayYYABQDoIBQKaYYJj3qMNZpvrV0mDevRRNUIag74oJBgDlIBgAZIoJhnHrKyziIKY6y6dV37tOWcDJWOi7YoIBQDkIBgCZqcFg+6jtq7bPVtoetX3J9un0s7/y2Bdtn7f9mu1PztqRSdPvpqsoD8uCOtP76jkUrOaMa8ksM4ZvS7pnTPs/RMSu9HNCkmzvlHS/pD9Pr/kn29ctqrMA1sfUYIiIFyS9PeP7HZD0dET8JiJ+Iem8pDsb9A9AB5psY3jE9plUatyc2rZJerPynIupLWP7kO0V2yurq6sNugFg0eoGw+OSPiJpl6TLkr4x7xtExJGIWI6I5aWlpbWe19r2h2mqu0ybbKcA+qZWMETElYh4PyJ+J+lb+kO5cEnS9spTb0ttAHqkVjDY3lr59VOShnssjku63/YNtu+QtEPSD5t1EcB6u37aE2w/JeluSbfavijpK5Lutr1LUki6IOmzkhQR52w/I+kVSe9Jejgi3p+1M6NLuE9bUr7OugnzLi0/6QK6TV4PlG5qMETEA2Oan1jj+V+V9NUmnQLQLY58BJApKhimTbvHlQ3zlhNNLyQ7ejQksBEVFQwAykAwAMgUFwyTpudrTf+b7J2Y93Wjy8VRTmAjKi4YAHSPYACQKS4Y1ut8hNGLzNRRt4yg/EDpigsGAN0jGABkCAYAmeKCYdqS8ZOOfqz7WYtYT3L4XvO8DihZccEAoHsEA4BMccEwyxWopPmvXDXpvUbXfKhbWoyWB+ySRJ8VFwwAukcwAMhMXcGpC2tttZ93abZFfe5aqms0DN+HPQ/oM2YMADIEA4BML4Nh0srNXRktI2bFnguUqpfBAKBdBAOATFHBMG5qPXrQ0aSp+ix7Auou5zauH3U+f9xrgBIVFQwAykAwAMgUFQzjptbTVmOe5/yGJsu5jZ5iXXdVaqAPigoGAGUgGABkCAYAmd4Ew6zbBdajlq97klR12wTbHFCy3gQDgPVDMADI9DoY2lybYVGG5cNoH0vuM9DrYADQDoIBQKbIpd1mNbpidInT82qfxvV3XJkBdI0ZA4AMwQAg09tgqB4sVNqqzKMHMY27OE6TE7qAtvU2GAC0h2AAkCkyGKadRzDckj/uepFNLhozy2fP8j6jZQLlAvqmyGAA0K2pwWB7u+0f2H7F9jnbn0vtm20/b/v1dHtzarftx2yft33G9u62BwFgsWaZMbwn6e8iYqekvZIetr1T0mFJJyNih6ST6XdJ2idpR/o5JOnxhfcaQKumBkNEXI6IH6f770p6VdI2SQckHUtPOybp3nT/gKQnY+BFSTfZ3jpPp6bV5GtdiaruNoJFbQ+Y90pUddaPBNo21zYG27dL+qiklyRtiYjL6aG3JG1J97dJerPysoupDUBPzBwMtj8k6buSPh8Rv6o+FoM/k3P9qbV9yPaK7ZXV1dV5XgqgZTMFg+0PaBAK34mI76XmK8MSId1eTe2XJG2vvPy21PZHIuJIRCxHxPLS0tLcHR93NGFJZikRSjtiExiaZa+EJT0h6dWI+GbloeOSDqb7ByU9V2l/MO2d2CvpnUrJAaAHZjnt+q8kfVrSy7ZPp7YvSfqapGdsPyTpDUn3pcdOSNov6bykX0v6zCI7DKB9LmEqa3tV0v9K+mXXfVmwW8WY+uBaGdOfRcRMdXsRwSBJtlciYrnrfiwSY+oHxpTjkGgAGYIBQKakYDjSdQdawJj6gTGNKGYbA4BylDRjAFAIggFAhmAAkCEYAGQIBgCZ/wd6orNo8zYTPgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as pl\n",
"pl.spy(bfgrad.mat.ToDense())"
]
},
{
"cell_type": "markdown",
"id": "3380c813",
"metadata": {},
"source": [
"Gridfunctions on product spaces consist of components"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "17f55a9d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"length of whole vector: 205\n",
"length of first component: 61\n",
"length of second component: 144\n"
]
}
],
"source": [
"gfu = GridFunction(fes)\n",
"print(\"length of whole vector: \",len(gfu.vec))\n",
"gfup = gfu.components[0]\n",
"print(\"length of first component: \",len(gfup.vec))\n",
"gfuv = gfu.components[1]\n",
"print(\"length of second component: \",len(gfuv.vec))"
]
},
{
"cell_type": "markdown",
"id": "e7e5ba85",
"metadata": {},
"source": [
"Restriction and embedding operators are available:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "c314b8ac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(205, 61)\n",
"(205, 144)\n",
"(61, 205)\n",
"(144, 205)\n"
]
}
],
"source": [
"emb_p = fes.Embedding(0)\n",
"emb_v = fes.Embedding(1)\n",
"\n",
"print(emb_p.shape)\n",
"print(emb_v.shape)\n",
"\n",
"res_p = fes.Restriction(0)\n",
"res_v = fes.Restriction(1)\n",
"\n",
"print(res_p.shape)\n",
"print(res_v.shape)"
]
},
{
"cell_type": "markdown",
"id": "127988c2",
"metadata": {},
"source": [
"## Mixed operators\n",
"\n",
"Alternatively one may define mixed operators. Note that in this case the test and trial functions must be obtained from the base spaces."
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "f829c585",
"metadata": {},
"outputs": [],
"source": [
"fesh1 = H1(mesh,order=order)\n",
"feshdiv = HDiv(mesh,order=order)\n",
"\n",
"p_,q_ = fesh1.TnT()\n",
"v_,w_ = feshdiv.TnT()\n",
"\n",
"bfgrad = BilinearForm(grad(p_)*w_*dx).Assemble()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "82c547e2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7d8fd31fd3f0>"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pl.spy(bfgrad.mat.ToDense())"
]
},
{
"cell_type": "markdown",
"id": "07678ea5",
"metadata": {},
"source": [
"Matrices may also be transposed:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "7e840338",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.409741197293665e-15\n"
]
}
],
"source": [
"n = specialcf.normal(2)\n",
"bfdiv = BilinearForm(-div(v_)*q_*dx+v_.Trace()*n*q_*ds).Assemble()\n",
"print((bfdiv.mat.T.ToDense()-bfgrad.mat.ToDense()).Norm())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0e334862",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

0 comments on commit 16b332e

Please sign in to comment.