diff --git a/public/content/exam/index-student-exam.pdf b/public/content/exam/index-student-exam.pdf index 5d220907e6012765d5f5f2d14bb2eb998a741fcf..ddcff0a25f8bfbb99608c1a3140136a949de3114 100644 Binary files a/public/content/exam/index-student-exam.pdf and b/public/content/exam/index-student-exam.pdf differ diff --git a/public/content/exam/index-student-solution.pdf b/public/content/exam/index-student-solution.pdf index 594c149c4bdbe407d1f31dafa600f122152f21b8..4a241f6419d24df124fd22390e2b42b6530f1630 100644 Binary files a/public/content/exam/index-student-solution.pdf and b/public/content/exam/index-student-solution.pdf differ diff --git a/public/content/exercises/cheatsheet.pdf b/public/content/exercises/cheatsheet.pdf index f04952c02afb7384c26696abbd95fc252b69df79..6384536ca43911fe03242722920fe5a78c9638d9 100644 Binary files a/public/content/exercises/cheatsheet.pdf and b/public/content/exercises/cheatsheet.pdf differ diff --git a/public/content/exercises/exercise01.ipynb b/public/content/exercises/exercise01.ipynb index ce0a53f9b451a752c398590337964abfcfda6683..e83805a1d0e4478b2f309e99c7639b9078c5964b 100644 --- a/public/content/exercises/exercise01.ipynb +++ b/public/content/exercises/exercise01.ipynb @@ -130,7 +130,7 @@ "> \\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n", "> $$" ], - "id": "1ce2a0eb-88d1-4bb6-8c73-0e37c0494e17" + "id": "bc55f1a7-09c3-4ea7-a962-e390a7345068" } ], "nbformat": 4, diff --git a/public/content/exercises/exercise01.pdf b/public/content/exercises/exercise01.pdf index c550f9c9e6ecc84e5181e77738ede1a2f800784c..c0bcc4d4d6f3b6faec5444ba366e8383ee78d21d 100644 Binary files a/public/content/exercises/exercise01.pdf and b/public/content/exercises/exercise01.pdf differ diff --git a/public/content/exercises/homework01.ipynb b/public/content/exercises/homework01.ipynb index 47b56e960c2813d18d7a8f33084e7009925945bb..0d036edf58b3fbd3ee5da62467eafe7928c6e446 100644 --- a/public/content/exercises/homework01.ipynb +++ b/public/content/exercises/homework01.ipynb @@ -284,7 +284,7 @@ "- one particular streamline in each figure\n", "- the streakline starting at $t_0$ for one particular $\\mathbf x_0$." ], - "id": "6fb9d62b-46eb-4fd6-840a-ea9bf140de7e" + "id": "b50a0e00-c42f-4096-a3ef-1d2914473ead" } ], "nbformat": 4, diff --git a/public/content/exercises/homework01.pdf b/public/content/exercises/homework01.pdf index de93a0f71c7b48a1caef49d52d6162607db205de..b249fd7ca39a40ed3d947b8133caf0d8e3752497 100644 Binary files a/public/content/exercises/homework01.pdf and b/public/content/exercises/homework01.pdf differ diff --git a/public/content/exercises/homework02.ipynb b/public/content/exercises/homework02.ipynb index 5307193a0a06b377f45fddaeb09fcaf5126e7d66..9e7383df92f8cf34249970223e585e5334ae7d5c 100644 --- a/public/content/exercises/homework02.ipynb +++ b/public/content/exercises/homework02.ipynb @@ -103,7 +103,7 @@ "For the visualization, we shall use the python libraries `numpy` and\n", "`matplotlib`. Here, we first import the libraries" ], - "id": "8d970556-15fb-43b8-8354-a0033c50b0b7" + "id": "fbee0f60-2015-47c4-b9ac-9351a49bb2b0" }, { "cell_type": "code", @@ -124,7 +124,7 @@ "Let us define a grid of points within the domain\n", "$x, y \\in [-5, 5] \\times [-5, 5]$" ], - "id": "67f6023d-fed0-42a0-aeb5-4e7b9c752f3b" + "id": "8d548645-c76a-400b-b9d6-4716d0ea6189" }, { "cell_type": "code", @@ -147,7 +147,7 @@ "Implement the computation for the components of the velocity vector at\n", "every point $(x, y)$ on the grid using `numpy` math functions." ], - "id": "b2e3db90-9a46-4688-a661-2dec58a179de" + "id": "9019f1db-99c0-46bd-b7cf-c1e85fae51f6" }, { "cell_type": "code", @@ -170,7 +170,7 @@ "\n", "We can now visualize the velocity field using a `quiver` plot" ], - "id": "2ac63586-6f4a-4b82-a303-4482b113d1e5" + "id": "ba063cd7-af2a-471c-b79f-93e609435a04" }, { "cell_type": "code", @@ -211,7 +211,7 @@ "Calculate the components of the velocity gradient tensor and implement\n", "the computation in the following" ], - "id": "2ef78175-5651-42ce-943f-409a8157b631" + "id": "61f2f416-e276-473a-94ee-92d22f747cf1" }, { "cell_type": "code", @@ -237,7 +237,7 @@ "We can now visualize the components of the velocity gradient\n", "individually." ], - "id": "2dd93398-61c2-4c53-9480-027c476f922d" + "id": "e3d14cda-291e-46b6-8138-cc85645dc364" }, { "cell_type": "code", @@ -306,7 +306,7 @@ "Calculate the divergence of the velocity field using already computed\n", "quatities, and implement it in the following." ], - "id": "c65e58e9-33c0-4c7e-8fb3-0639908c33a3" + "id": "8a3a1567-fec7-4a90-9a17-c32385c0043b" }, { "cell_type": "code", @@ -328,7 +328,7 @@ "\n", "Plot the divergence of the velocity field and interpret the result" ], - "id": "65b40e9f-26b6-477e-a924-bb8d77c2053b" + "id": "be370a1e-4706-40e9-b654-6c184b5f549e" }, { "cell_type": "code", @@ -353,7 +353,7 @@ "Calculate the vorticity (or curl) of the velocity field using previously\n", "computed quantities and implement it in the following" ], - "id": "8f785fc5-1bdb-4323-89c7-cf8b8aab7317" + "id": "474b5885-d366-4813-a4f9-bd7829891c5c" }, { "cell_type": "code", @@ -375,7 +375,7 @@ "\n", "Plot the divergence of the velocity field and interpret the result." ], - "id": "f2c4aad5-28e7-41c8-bb1d-1ff495bc13ee" + "id": "a4f2094d-c73c-45cb-84fe-3eae11b39de9" }, { "cell_type": "code", @@ -585,7 +585,7 @@ "image/png": "iVBORw0KGgoAAAANSUhEUgAABSwAAAQKCAYAAABKaTR7AAAABHNCSVQICAgIfAhkiAAAABl0RVh0\nU29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAudEVYdENyZWF0aW9uIFRpbWUAVGh1cnNk\nYXkgMDIgTWF5IDIwMjQgMTE6MDg6NDYgQU0sUd1yAAAgAElEQVR4nOzdeVQUZ74//jcQ1KHDErAN\nSzDdJhGRTJIxsjjfOQMqajSOSBbBqAhxbiKgYJIbM4rEq4KZxHHijpOchBY30MQliSQuqOTcc1Ug\nZuYeo2I03bFpBVtaoUURBuv3B7+qS7M2azXwfp3T51BdVU99qrtp6nmoepedIAgCiIiIiIiIiIiI\niGyAvdwFEBEREREREREREYk4YElEREREREREREQ2gwOWREREREREREREZDM4YElEREREREREREQ2\ngwOWREREREREREREZDM4YElEREREREREREQ2gwOWREREREREREREZDM4YElEREREREREREQ2gwOW\nREREREREREREZDM4YElEREREREREREQ2gwOWREREREREREREZDM4YElEREREREREREQ2gwOWRA0c\nPHhQ7hKIiIiIiIiIiPo1O0EQBLmLILIVarUaWq1W7jKIiIiIiIiIiPotnmFJRERERERERERENoNn\nWBIREREREREREZHN4BmWREREREREREREZDM4YElEREREREREAIAlS5bIXQIRES8JJyIiIiIiIqJ6\nWq0WarVa7jKIqJ/jgCUREREREREREfVp4kC8VquVuRKyxkNyF0BERERERERERNSdIiIi5C6B2oFn\nWBIREREREREREZHN4E13iIiIiIiIiIiIyGZwwJKIiIiIiIiIiIhsBgcsiYiIiIiIiIiIyGZwwJKI\niIiIiIiIiIhsBgcsiYiIiIiIiIiIyGZwwJKIiIiIiIiIiIhsBgcsiYiIiIiIiIiIyGZwwJKIiIiI\niIiIiIhsBgcsiYj6iHHjxsldAhEREREREVGn2QmCIMhdBBEREREREZG17t69CwBwcnKSuRIiIuoO\nPMOSiIiIiIiIepWioiIUFRXJXQYREXUTnmFJRERERERERERENoNnWBIREREREREREZHN4IAldZvb\nt2+jrq5O7jL6jLfeegt6vV7uMoiIiIiIiIiIuhUvCaduExcXh9/97ndISkqSuxQiIiIiIiIiIuol\n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\nysoumz8s+r66ujoiIiJYvXo1jz32mLJv1tTUKO03WyyASqWyZ6lCCNFvSIel6BKDwYBOpwOgN20y\nfn5+VFVVAR2ZkWVlZWg0mh6twcHBQXn98xsr0mHZPzk4OBAZGQnAiy++2CmzElBmcs3IyFCGgJ8f\no+Du7s6ZM2eAjs4MX19f5cpK2/NeiWQeCdE3BQYGUlpaSnZ2NlqttlPmsY2vr2+njFvRv9jaC1dr\nH+h0OgwGAwEBARLD00ucOnWKwMBAKioqWLZsGTt37mTw4MHSodxPXJgxacugtE18Je15IYSwDxkS\nLq5Zb8rdmjZtGi4uLkyYMIFFixYxdOjQHn39vXv34uLiwsyZM0lOTqa2tpaZM2cyc+ZMfHx8erQW\ncX3Ytvfi4mJ2794NdExClZ2dfcn1bVlVkZGRlJaWXvRh88svv2T58uUsX74cFxcX7rnnHu64446r\ndlYWFxdjsVgk80hcd7YMLtG9bMcCW8bll19+ybRp0zqtY7FYePrpp5UM5PMz0ET/oNFoutw+kM5K\n+7JYLOzevZvdu3dzxx13AB0Z1FFRUZhMpov2X9E72NpLF7IdT23LL8yYzMrKUjImbZniPj4+0p7v\nQdL+EEJcSDosRZeEhIQQHBwMdAyJ6A2ysrJwdnYmPT2duLg40tLSqK+v79GhdXV1ddx00014e3vT\n2tpKYmIi3t7ePPzww4SGhvZYHaJ7XLjtrF69mi+++ILHHnuMgoICFi9erCyLiopSrqa8Fh4eHixa\ntIhFixbh4eFBRkZGl8L4TSaTZKKKHtHS0kJLS4u9y+jX4uPj8fDwYMeOHaxfv175qa+vJy0tjbS0\nNOLi4qivryc9Pd3e5Ypu5OrqesVZ4ouKiigsLLzic5yfmSeuj9WrV5OYmEhNTY2SWZ2YmEhoaKjS\nvjs/t1b0PFub7cL9wdZeunC5LVPS9vv5x9eNGzfy7bffKhmTtr/t+X9vcf1J+0MIcRGrEF2Qk5Nj\nVavV1t60yWi1WitgPXbsmNXb29u6evVq65QpU6y+vr498voJCQnWY8eOWT09Pa2lpaXWZcuWWZ2c\nnKx5eXlWrVbbIzWI7uXr62sNDw+35uTkWAMCAqxOTk7WUaNGWQGrt7e31cnJyerp6WldvXq1Va/X\nf+/XKysr+/5FCyH6hfDwcGteXp4VUH6mTJliNRqNyvlG9G22v+uVzh96vd4KWPPy8i67jlartVZW\n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\nq3vnRt3Lly/j6elJfHw8s2bN4uTJk1y6dAlPT0/0ej3h4eG/WcalS5fU/3t6enL8+HE++ugjANat\nW0d2djajRo1i06ZNd1SeEHfK09Pzpu8d7VlmY2Mjv/zyC7a2tjf83NXVlbKysnY9f1cVExPDggUL\n0Gq1ZGVlARAWFgY05cwBd/2CZEL8Xpl+v4OCgm76nmo0Gnn88cf5/PPPcXV1xdbWlh49etC3b18W\nLFiAjY0N69atIzc3F1dXV7Njr19UsT1169YNQK3PxYsXO+Q8QsCN/YOO6IMIIYT4fbt3RpruQrNm\nzSI9PZ0VK1YQGRlJamoqNTU1rF279qb7mzIRKysr8fT0ZN++fZ1c4ya2trYMGDCAd955557LYDQt\nKgSomZbNH7sdU8aOo6Mj48aNo1+/flRWVjJz5kyKi4spLi4mKSmJoKAg8vLyWrWQjxC30xF/KFxf\n5vUZT81/fqsM3nuRKTMOmgYqTYOVAPv27bPY+7MQou1Mv9/N39+aZ+qlpaVRU1OjPhYZGcn7779P\nTU0NqampQNN7o62tLZMnT1bfK0zvkR2dIblp0yYuXrzY7pnn4vfhVq/P3bt3m2XSXt8/kMFKIYQQ\n7U0GLC2sqqqKnj17smHDBubOnYuDg8NtMypNeUXNMy07W/fu3SkpKaGkpIQVK1ZYpA7tzZQ5WVtb\nS21tLd9++y2jRo0CmjI7gdtmUB08eJCCggI1Y2fbtm2MGjWKJUuW0LNnT7766is1wxLAzs4OOzu7\nzmmcEO3odhlPN8uv+z36rffn22X2CSG6pujoaOLi4oiLi6OsrIzu3bur/bUNGzYwZcoUEhMTuf/+\n+9VjHBwc2LFjB6mpqdjb25OSkqL2F+Lj4295rtZkXpry/EaNGsWoUaNISkpq98xzcW/4rdfXrTJO\nq6qqbsikFUIIITqSTAm3oMrKSiIiIvj000+BO88c2rlzJ6+88goZGRlqBkzzTJjrM2Tam2nKUWJi\nIsHBwfj4+HTYuTpLbW0tFRUVAIwYMQJ7e3v1+jY0NLBy5Uri4+MpKyvDxcXlpsfHx8fz5ZdfUlpa\niru7OxUVFTz44IOcOHHCLMNy1qxZN80oFUL8Ptwus08I0TW5urpSXl6u9rtulnnt5ubG3LlzcXZ2\nZuHChWpmNTTl7cXGxvL000+j1WoZNWqUmr9nyiw27V9ZWWmWeQk35gNez5RhaW9vj7OzM6Wlpfj7\n+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\nVf000/HNP/8tmRldXFzMs88+y8CBA/lf/+t/UVVVxdKlS0lNTW1VeTExMYwePRpvb29OnjwJwKJF\ni3BwcDDbLyQkRO0nrV+/vm2NEEIIIYS4jgxYdoDJkyfj6+vL2rVru2zeX58+fdBoNK3ONhw/fjwT\nJkwgIyOjy2RYbtiwQV3ZeM+ePeoqoW+99ZaaVWUwGNRMpmnTprFr1y5mzpzJ3Llz6d69O1FRUfzp\nT3+ipqaGwsJC9Q5FE1N25G+5fPkyNjY2JCQkcN9996nT5z08PHjjjTfaqcU3V1tbS1RUFA4ODtjb\n26PRaPjwww/R6XQkJyeTlJTUJZ4vcXc6d+4cycnJsiiPEKLL27JlC2lpaQD84Q9/wMHBgY8//pjC\nwkLCwsLM+gN3ora2ll27dpn1D3x9fYH2yYxurXPnznHt2jVqa2uZPHkygYGB6syP1pg2bRphYWF8\n88036kDkmTNnWLRokTrAu3jxYk6cOIGnpyfffvstsbGxXLp0qV3aI4QQQggBMmDZYdzd3Tt8YKot\nhgwZwpAhQ9ixYwfFxcWtyrE0mTJlSjvWrHXy8vLIy8vjwoULWFtbq3mPwcHBJCcnq4vS7N+/n7Vr\n1+Ln54derycnJ4fw8HCzDKapU6eSmJh40/Pk5+erZSUkJJCXl8fhw4dv2G/AgAEADBo0CGtra/Xx\nzsgGHDt2LMePH8fZ2Zm6ujo0Go2aORofH8/s2bNlwFK0milbVQghujqNRsMbb7xBQkKC+nkITZ/F\nn3/+OR4eHsyePZvVq1eTl5eHo6PjbcszGAzMnj1b3c7Pz+e1115Tt5OSkrh27Vqn53qbMtR3795N\nXl4eQJumupsyP8eOHcsPP/xAQkIC0dHRbN68Wd0nIiKCbt26qf2dtgyQCiGEEELcjAxYdgArKyt6\n9epl6WrcoL6+nqtXr6LRaBgwYAADBgzg73//e6syh65evUpDQwN2dnYMHz68A2rbMhcuXGDZsmVE\nR0dTV1fH9u3bKS4upl+/fpw8eZKsrCzeeOMNHn/8cQwGA8uXL2fLli1ERkZSWFiIh4cHNjY2lJaW\n4uLiot499l//9V+3vD6maWZdRfPMyvDwcHr16sXChQvx8PBg5syZapsmTZpkwVqKu11JSYn8YSqE\nuKvcbABx+PDhKIpCRkYGOp2OYcOG3TJz3NR/GjduHDU1NUBThmNISAjR0dH88ssvzJs3Dz8/P775\n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\neZXjx49XMqRF4xgzZgwHDx5kx44dODk58eabb2JlZfW7maFWVlZcv36dHTt2sGPHjjpnjC5dupTC\nwsJar+kzMS9fvkxSUhIBAQH3lInq4eGBlZUVPXv25LXXXsPf35+EhARMTEz44IMPOHjwYJ23dS/7\n1GuM/FYhhBBC1I90WAohhBBCtCJlZWXcuHGDa9eu3XW5/Px8zM3NCQsL49FHHwWqO7/69OnDP/7x\nD/r06cPf/vY3oqKiuHHjRp33HxgYSP/+/enevTtjx45l7NixypDzB8mNGzcoKyu7p3WuX7+u5Ebf\nTc33NjAwECsrKyZPnkxcXJzyfk2ePPm266rVarRaLRkZGZw+fZq///3vuLu733H5my1duhRbW1uc\nnZ2V/WdnZ3Px4kV+/vlnlixZgqurK4mJiXz66aeYm5uTn59/x+P19vbGyMiIGzducPr0aYyNjfnp\np59wdnZm9+7d7N69W9lXQ6q5zZoPbBJCCCFE8yAdlkIIIYQQrUh0dDTFxcXMnTv3rst1796d5ORk\nHnvsMQC+/fZb5aneixcv5vPPPyc5OZmIiIh7ehCPv78/1tbW9OzZk4iICHbt2kVxcXG9jqk5Ki0t\n5ejRo3ecX1xcTHR0NHD7PM/brV/XzOia721kZCQnT55UMiUDAwPJz8//3QciTp06tVZ99/IAxX37\n9vH9999z9OhRIiMjee+995g7dy4JCQkkJCQwevRoxo0bR2RkZK2M1Jvpl587dy79+/dn165dRERE\n0LNnT7799lveffddpk6dWue6hBBCCNF6SIelqLdOnTrh5eVl6DKEEEIIQXVnVpcuXeqU+Vczozg4\nOJi5c+fSrVs3evXqxYsvvsj58+eJiYnh0qVLddr34cOH8fb2VjIRR48ezfbt2+nSpUu9jqk5qqys\n5MyZM8r0hQsXamV6d+nSRelYvN3TrW9eH+qeGX3zeztjxgwiIyPrfJckQK9evejWrRuJiYkcOXKk\nzuvp9xcWFqbUr8+sHDRoEIMGDUKlUikZlImJiVy4cOGu21OpVMTFxfHqq68SExPDwIEDCQgIoGvX\nrsoykjkphBBCPFikw1LUm5WVFWPGjDF0GXfk6uqq/Hdz5pIQQgjRUjRFzt748eMxMTFh9erVJCQk\nsGfPHsaMGcOBAwfqtL7+Dk2gzpmIzZk+37EmfYbjze2ftm3bMmTIkNtu53YZng3Zftq+fTtr167F\n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\ngcbGRry9vRk0aBCVlZUYjUa++OILNm7cSFFRET/60Y9obGzknXfeYdSoUUyYMAHofHDPrFmzMJvN\nrFixAj8/PwCOHj3KihUrmDVrFjk5OaSkpADQt29fYmNj8fb25qabOvv51QysF154QXt6YlpaGs8+\n+ywVFRUkJCQQHx9Pa2srR44c4cCBA+h0OkaNGsXq1aspKiri0KFD2nyA/fv387Of/Qw/Pz+Kior4\n+c9/rmVuWSwWLexczQ+tqKhAURSX95GawXf27FntqexCdBfZ2dna5/Lo0aO899572uelvLychQsX\nujwUICcnh4ULF7JlyxasViuff/45S5cu9VT5QggP8vb25rPPPiMoKMgj+c7qU8KffvppUlNTsdvt\n2vlMiOvF0qVLWbp0KWvWrHH5e3Z2Nrt27eKxxx6jvLycL774wiVTXgghhLhsnr7FU3zFaDQqgJbB\nuGTJEkWn0ynNzc1a5lJgYKDLsGn+/xy2fv36KTt27FACAwMVq9WqmEwmxWQyKVarVbHZbIrRaFQy\nMjKUU6dOuWQoqUOo1czI8PBwxd/fX6mpqVEyMjIUi8WihIeHK4AyePBgZezYsdq0mjk5duxYZfDg\nwVp9ivLVEO/w8PAL5qt1q0PKbTabllEZHh6uWK1WpaGhQVmyZIly6tQpbf7YsWO16a77r85fu3at\n4u/v73I8t23bpmXwqPunLn9+Rqdaj9r+gQMHlOjoaO34q5mf59cXHR2t1NTUaBmgaiaVOkRdzcRc\nu3at0tzcfEF96vLq8e6asWez2ZQDBw4oaWlp2v6qGVzq9PkZmjExMS7rC3E9Oz/jzWKxKGPHjtXO\nB10zW9XzYdfzg6qmpkbLqBRC3JgAxWAwaN/f7qZmdKuZgF0jaoS43qnfu10z6bteXwshhBCXSzos\nryGJiYmKl5eXlimpZqwBWuZaR0eHS2ZlSEiI1oGndghWVVUpPXr0UHr06KEAipeXl5YZCWgZlV0z\nJvPy8rQMmq4dZjqdTuno6HCpp3fv3kpiYqKiKJ0ZjXa7XZtWlK8ybtTMzPPnK4qiZV6qy6vzQ0JC\nvlWmU35+vtK7d2+lurra5fip0123r9PptAzO5uZmJTg4WNm8ebNWX9f5iqJox793796K3W5X7Ha7\nliGq7u/8+fOV+fPnK3a7XesQTkxMVOx2u5YhqmZ6qvundmCqmZuKomgdmF3rDQkJUUwmk5KXl6d0\n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\nZGosUWNhvR5euHABOp0Of/vb39C+fXvk5eWhsrLSZue70WjE/PnzodfrH7mtl5cXBEFAQUEBX29E\nRERENcA7LIlkolmzZlAoFADu3NH4+++/S1wR4OjoKP47OjrarquwElHNBAUFITAwEADQrl07Nk9I\ndgoLC3H9+nW4u7sjJiYGS5YswY8//miT5rzBYIBCoYDRaERUVFSNmpVWy5cvh6OjI2JjY3H9+vV6\n1UFEREQkd2xYEslQY8qMtGbkxcfHIzY2VuJqiJq2iooKTJo0CampqVKXQmQ38fHxMJlMuHbtGk6d\nOoU5c+bY5A2ziooKXLhwAbGxsXBxccE333xTo/12794Ns9mMkydPIjY2FikpKSgtLa13PURERERy\nxoYlkQx169bNZhld9TVjxgzx342lJqKmytnZGW3atJG6DCK7uTujNSEhAZ9//rnNMp2vXLmC9evX\no3///nBxcanxftu3b4fZbMbRo0dx9OhRaLVazjggIiIiegQ2LIlkJC8vT+oSHqpPnz5Sl0DUpCmV\nSrzwwgtSl0FkN0OGDIGfnx8AIDQ0FB4eHhgyZEi9jjlhwgQUFxfD09MTFy5cqPXxNmzYAE9PT3z+\n+efYv38/oqKiUFZWVq+aiIiIiOSODUsiGWnXrp3UJRBRI2YymRAfHy8+LioqkrAaIttLS0tDQUEB\nnJ2dkZeXBwcHhzovQHf9+nWsWbMG58+fx7hx46BQKODo6Fjr41kzNcvKyrB69WqsWLECly5dqlNN\nRERERE0FG5ZE1GA+++wzqUsgatJUKhXmzJkjdRlEdhMYGIjo6Gi0aNGi3se6du0ann32Wfz444/4\n8ccf63SMnJwcjBkzBiaTCX379oXBYMC//vUv5sgSERERPQIblkQylJ6ebrPMLlvy9fWVugSiJq2s\nrAzLly+Xugwiu7JmRs6cOROdO3eu9fVw2bJl8PPzw/vvv4+RI0fWq5ann34azzzzDABg3759WLp0\nKf744w+8//779TouERERkdyxYUkkQ0OGDKl3Zpc96HQ6qUsgatLc3Nwwffp08TFjJEjOtm/fjlOn\nTtX6enj27Fns378fer2+3jV4eHjAw8MDeXl5CAwMRGBgIFavXo1r167V+9hEREREcsaGJZEM/fbb\nb/j999+lLuM+t27dkroEoibtxo0bKCgoEB839oW6iOqjsLAQgiDUOHNy9OjRKC8vx5IlSyAIAhwd\n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\nliIOxmKxUFNTg8lkYuPGjVgsFh577DHGjx9vszlOnDjBX/7yF4qLi+t8/ty5c9bNCPr3709ERAQZ\nGRk2m19ERKQuGRkZ3HrrrRQXF5OdnU1sbCy/+93vGjTGggULuPPOO/nxxx/57rvvLtmwp74OHz6M\ns7Mzbdq04cYbb6S6urpR44iIiIi0RsqwFHEwb775pvXvn376KQMGDCAsLMymY//xj39kwoQJ9dqw\n56mnnmLYsGE2mV9ERORKhg0bhslk4i9/+Qv5+fmEhYXVew0qKyvjs88+o1evXjzzzDO4ubnx0ksv\nNamekJAQwsPD6dChQ50b4YmIiIhI3XSFpYiDWbVqFc899xwAL7zwAu7u7owcOdImYy9dupTg4GBu\nu+02606pdbn//vsZPHgwq1atIisri9dee80m84uIiNRHbSzJJ598wpYtW656/OOPP05paSkffPAB\nfn5+TW4uPv7443h6evLuu+/y6quv8qc//anZM6RFRERErme6wlLEwdRmRiYlJWE0Gm027qRJk/jk\nk0/o2rXrVY/99NNP2bp1K9u3byc3N5egoCA8PDxselu6iIjI5Tz55JMcOnSI++67j/vuu++yx9Xm\nW3722WcYjUaSkpJo27bpb48/++yzizKcV69eTWVlZZPHFREREWktdIWliIMZNmwYM2bMYNKkSRQW\nFjZprN27d2M2m1mwYAFJSUn1albC+QxLf39/DAYDhw8f5uWXX1azUkRE7Kq4uJiuXbvyj3/8A4PB\nwMMPP0ybNm244Ya63+7u3r2b8ePHU1hYyOeff87IkSNt0qwEyM/Px8vLCy8vL+666y7CwsKs66mI\niIiIXJ0aliIO5M033+TOO+/k3LlzvPjii7i5uTV6LLPZzKBBg9i/f3+jMrx69erFc889x9NPP83w\n4cPJzc1tdC0iIiJX4+3tzV//+ld69eqFq6srDz/88BUznAcNGoTZbOall17C29ubDz74wGa1vPnm\nmxQXF7N582aOHj3KO++80+j1VERERKQ1UsNSxIEsXbqUBQsWsHv3bnbv3t3oHUm3bNlCVFQUy5cv\nb1Tm1v33309ZWRmTJk2ipKSExx57jF27djWqFhERkfqqXX+WL19OUlLSZTOcJ0yYwNq1a20anTJh\nwgTr34ODgwHo3bs3+fn5PPjgg+Tl5dlsLhERERFHpwxLEQdRmzFpsVgIDAwkKSkJDw+PBo9TWFjI\n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\njMrLSU9PJz09nfz8fDZt2sQvv/xChw4dMBgMuLi4cPLkSb788ku+/PJLqqqq+PLLL/V+QURExEGo\nYSnSCgUHBxMcHAxAYmJis849d+5c5s2bx86dOykvL69XRmbtBxYREZGhQ4fy2GOP8fjjj9O9e3cK\nCgquek5iYiJRUVE2raO4uPiiDM0///nPjBo1iry8PJvO01olJibi5+eHn58fiYmJF2WOJiYmsnTp\nUp5++mn69u1L3759mTt3Ln379iU9Pb3Z39uIiIiI7alhKdIK9enThz59+gCwcOHCZp37nXfeYerU\nqTz66KP1yrRqjhxNERG5fowaNYr4+Hjc3d1ZsmSJdT37tdqc5ri4OH772982KbPy12rXpqysLEJC\nQqy5jS+//DIdO3a02TyOLisri/DwcEpKSigpKSEuLo64uDhKSkro2rWrNcNy4cKFnD59mpCQELKy\nsli4cCHTp0/nvffes2ZoXvh+ZuHChZfN6RYREZHrQ9PviRERqYeYmBhSU1M5fvw4rq6u9T5vwIAB\n1vMHDhxIly5d7FWiiIhcw44ePUpMTAwAe/fuBc6vDfHx8Zcc26NHD+uO3U899dRFm7rZwoABA/j6\n66959dVX+f/+v//Pept5WFiYTedxRDExMcycOZMuXbrw3XffYTabCQgIAKC6upqEhAT69+/PsWPH\ngPNRMl9//TXBwcGkpaVZjzMajbz44ov85S9/obq6+pJ5UlJSrJshiYiIyPVHV1iKiF3VZkotWLCA\n++67r0HNSgBnZ2f8/f2pqqqyfkAVEZHWx9PTk88++4yoqCgKCwv56aefiI2NrfPYW265hW+++QY4\nv47k5ubatJbhw4dz2223ceONNxIREYHBYLDp+I7G398fg8GAwWAgISEBo9Fo3UQHoLy8nPLycmpq\narjhhhuorKzkzJkznDlzhpkzZ3LmzBm8vLysP/8+ffrQs2dPnJ2d8fHxoaioiAcffJD/+7//4803\n36RTp0788ssvalaKiIhcx9SwFGnlysrKyMzMtNv45eXlrF+/noKCgnrlVf6at7c3s2fPBs5/QBQR\nkdapdj3p1KkTY8aM4a233mLevHl1Hrt58+aLMg8v/HtTZWZm8qc//YmpU6fSqVMnunXrxvPPP2+z\n8VuTCzO1a3300Uc8+uijuLm58fzzz1NeXs7gwYMpLi5m4sSJPP744+zcuZPNmzcTHBzM+vXr8fb2\nZvPmzYSHh7Nz50527tzZQq9IREREbEW3hIu0ck5OTvj4+Nh83Li4OD799FPefvttfHx8Lpsx1lAT\nJ05UrqWISCs0fvx4AAYOHMjq1asZOHAgK1asICsri0GDBlmPq11/LtyszZb5lT4+PphMJnr06MG/\n/vUvevbsabOxW5s+ffowdepUHnjgAd5++23r4wMHDuT+++/nl19+Ac5vtFRRUUHnzp0v+n7b6r2F\niIiIXHsMFovF0tJFiEjzq6qq4g9/+APHjh0jKirKprdNrVmzhsjISPbt20f37t2prq7G2dm50ePV\n1NQQGRnJmjVr8PPzIz8/32a1iojI9cFgMDB27FicnZ157733AHj00UdJSEiwZkiuWbOGqqoqHn30\nUTp06GC3Wvz9/SkoKGDs2LEkJCQQFBREYWGh3ea73pWXl2OxWEhNTQXg1VdfBeBf//qXNfqlrrU9\nJSWFmJgY2rZti9Fo5Ouvv27WukVERKTl6JZwkVbK2dmZG264AYvFQlVVlU3HdnNzIy0tjaCgIAwG\nQ5OalQBt27ala9euODs7U1xczNy5c21UqYiIXC8qKyvp168fvXr14u677+bnn3/m7bffpm3btuTk\n5FBcXMw333zDxIkT7dasTElJISAggOLiYjZv3kxZWRn79+/n7NmzdpnPUbi6utKhQweio6OJjo6m\nsLCQG264gS1btpCenl5ns7KgoACTycSMGTPYtm0bCxcutGZeioiIiONTw1JEbCYxMRGA8PBwwsPD\nbTr2nDlz8Pb2xtXVlb59+9p0bBERufYtX76cEydOsGrVKuLj461rTmZmJu+++y7e3t7MmTPH7nX0\n7dsXV1dXzGYzBQUFrF+/nrFjx9p9XkcTFRV11fcLwcHBfPDBB7z11lvKsRYREWll1LAUacVq86Ky\nsrL49NNPmzzewoULmzzGlbz99tuUlpYSFRVlk3pFROT68MQTTzB37lzOnDmDm5sbcH4ncID169cT\nExPDE088Ydcajh8/Tm5uLidPnuS///u/OX36NKmpqSxdupSlS5fadW5HVJ9c0T59+pCamsry5ctJ\nT09n6tSpzVCZiIiIXAuUYSnSyhkMBgCSk5OJjIxs1Bhr1qwhOjqa8vJya0C+vRiNRmbOnImzs3Oj\n6xURketHTEwMU6dO5eabb7ZmVy5dupQDBw5YMytNJhMVFRW4urrarQ6LxUJycjIAJpOJNm3aEBUV\n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\noH379jUar6SkhF27dtW6rjFjxlBQUICTk1ONMzDl9zk7O1szs+fMmUNkZCRhYWF88cUXAMoMFRER\nucGoYSkiv9G4cWOSk5Px8PCgoqKC0NBQ/vWvf7Fr165LNiFNJhMJCQkMHDiQe++9l+LiYiIiImjW\nrFmd13q5pqjRaCQkJASz2UxISAjHjx+v81pERKRmvLy8aNeuHX379uWxxx5j+fLlODg44OnpWa0x\nABITEzl8+LDNMpNjY2NxdnbG39+f48eP6/Okjnh5ebFw4UIaNWrEsWPHOHfuHKWlpQQEBODt7d3Q\n5YmIiEg9+0NCQkJCQxchIlevrl274uPjw08//cSbb77JpZaMc+fOkZGRwZw5c3jiiSfqvKacnByO\nHTtm3YFzOWFhYeTn57Ny5UoOHDjAAw88QJMmTeq8PhERqZqcnBzee+89Nm7cyNq1a0lMTATghx9+\n4NixY3z44YdVHqukpIS7776bP/3pTzg7O9usxtWrVxMUFMSCBQuYN28erVq1wt3d3WbjywWhoaGc\nO3eOoqIiTp8+zeeff86qVasICwvD39+fAQMGNHSJIiIiUo+0w1JErujdd9/l0KFDbN++neTkZAoK\nCggJCSEkJISCggIATp48yeDBg2nRokW91JSenl7lC3yef/55AFJTUyksLKzLskREpJrS09N55pln\nOHHiBG5ubowfPx7479pdHTV550oqP+/8/PyYNWuW9cKd+spkvtG0aNGCN954g6CgIF577TWSk5O5\n6667eOaZZ9ixY0dDlyciIiL1rNH58+fPN3QRInL1slgsvPLKK5w5c4apU6cC/z12l5eXh6enJ+Xl\n5cCFo+R1zc/Pj8zMzCrPZzabrfU2a9aMU6dO1Wl9IiJSdeXl5Zw9exZfX1++/PJLXnvtNc6ePUt8\nfDytW7eul2iRy6n8/GjatCl79+7Fw8OjwWq5kZw5cwZvb28OHTqEwWDgzJkzTJkyBV9f34YuTURE\nROqRdliKyBW1adOGF198kWXLllFcXExWVhYA8fHx1iNxjRs3rrNm5Y4dOzCbzQAMHTqU7Ozsas3n\n6elJWloarq6unD59mrKyMut4IiJSdyo/L670++vXr+ff//433bp1o1+/fgQHB5OVlcVjjz122Wal\n2WymrKysLkq+yLhx4zAajSQlJfHUU0/V+XxyQdOmTTlw4ABDhgwhOTmZP/7xj7Rs2bKhyxIREZF6\npoaliFzRqVOnWLJkCTk5OaxZs4bHH3+cQYMG8c0339TLbsWFCxdaM83WrFlTozGCg4MJCQkBYNas\nWWzbts1m9YmIyKX93pq9bNky9u7dy969e+nXrx9FRUXs3buXd955h+3bt1/2vcTERPLz821d7iXr\nO3ToEIcOHaJfv351Pp9crPL/P/Hx8bRt27aBqxEREZH6poaliFxRy5YtiYmJwWg0Eh0dTcuWLRkx\nYgRHjhzhr3/9a53MuWnTJjZt2gRcaJhWZprVxvjx43FzcyMxMZEjR47UejwREbmyF1544Yq/Hx8f\nb20I/v3vf8fe3h5vb29cXFwu+86vPx/qWmFhIT/++CM//vgjN998c73MKSIiIiIXKMNSRKrkzJkz\n9OjRg71792IwGJg5cyZ+fn4cOHDApvNUZmYmJSXRuHFjTp8+bbMMs9OnT9O8eXMaN26M0WgkIiLC\nJuOKiEj1ubi48Oc//xmASZMm8eCDD5KXl3fFd8rLyzlz5gzNmjXDzq5u/93dx8eHSZMmERsby759\n+/D09KzT+URERETkv7TDUkSqpGnTpnTu3JmdO3cyY8YM9u3bx/fff2/zeTp27Mh//vMfa0alLS9c\naNasGXl5eZSXl/P4448ry1JEpIFkZWXh6enJ0aNHOXr0KCNGjLhsszIxMZHDhw8DFzKTnZ2d67xZ\nOXToUL777ju++uorysrK1KwUERERqWf2DV2AiFw71qxZw3PPPYfFYuGXX37h3nvvZcyYMSxevJhB\ngwbV6gbPdevWkZOTw6RJk+jVq5cNqxYRkavJunXriIiI4Pvvv+e1114D4J133vnNc0VFRWzZsoX4\n+Ph6qatyPoB+/fqRlpZmrffOO++84lF1EREREbEt7bAUkWqJj4+nTZs2HDlyhA4dOmBvb8+hQ4dI\nT0+v0XijRo1i06ZN5OTkcNttt/HGG28QGhpq46r/y83NjQkTJljnFhGR+pWamkphYSGRkZHs27eP\nffv2ce7cud88Z29vT5s2beqtrsr52rRpw9///nfc3NwYP348bdq0wd5e/8YvIiIiUp/UsBSRavn5\n558pLi7G19eX6OhonJyc6NatW43HmzRpEitWrOC7776r1ThV9et6N23ahJ+fX53PKSJyo0hJSSEl\nJeWSv1e53iYlJVFUVERaWhppaWk8+OCD/OlPf/rN87fffjvdu3evy3Ivqs3JyYnu3bvTvXt3nJyc\n+Pnnn7nnnnvIycnBycmpXuoQERERkQvUsBSRavHw8GDYsGHs2bOHVatWYTabWbVqFf7+/uzYsaNa\nY4WEhHDw4EHat29PcnIyHh4edVT1xSIjI4mMjATgxIkTyrIUEbGRiIiIy15oNn36dIYOHcrp06cJ\nCAhg+/btzJ07l3bt2pGbm0t2drb12ZCQkIu+rmu/nstgMGA2mwkMDGTixIm6oE1ERESkAahhKSLV\nFhISwtSpUwkLC8PFxYXbbruNv/71ryxYsKDKY6xbt46UlBTS09NJSEiou2IvY+DAgUyaNIn8/HwS\nExPrfX4RkRtJcnIyISEh7N+/n6SkJP785z/Tv39/WrVqRUhICACrV6+2Pl+ZH1nfcnJyyMnJAWD7\n9u0N8vkkIiIiImpYikgNtWnTBpPJxLPPPsvgwYMxGAycPn36d9+rzI2szDB74YUX6rrUSwoNDeWN\nN94ALhwN37RpU4PUISJyvZs9ezbjx48HLlxss2jRImJjY1mwYAFHjx4FLnw2NNTnwa+5uLhYL9dR\nzrGIiIhIw1HDUkRqpHv37oSEhDBx4kSCg4NxdXVl69atV3zHz8+PTZs2kZKSwl133VVvR8CvJDs7\nm4MHDxIcHIzFYmnockRErjs7d+6kpKSE7OxsaybkkCFDmDp1Ks2bNyclJYXZs2c3dJkAfPHFF3zx\nxRcAV01NIiIiIjeiRufPnz/f0EWIyLUrOzubtm3bAnD48GGmTJlCTEwMgPWY3/HjxzEYDMTExBAc\nHNxgtV6JwWDAZDKhJVFExHbS0tIwGAy0bdsWd3d3XnvtNUwmE1OmTMHd3b1Ba8vPz2fRokXWY99m\nsxkvLy88PT35+uuvG7w+ERERkRuZdliKSK289957JCUlsX//fkJCQkhJSeH777/n1ltvtT5TeRPs\nr/PJria/zixLTk5u4GpERK5NRUVFrFu37qJfu/XWW4mNjeUvf/kLK1asYPny5YwcOZKPP/64gaq8\nIDk5GXd394syKivX/969e9O8efMGqkxEREREQA1LEaml+Ph4goOD2bJlC9OmTaOwsJCPP/7YmgFW\nUFBgzS9rqON1lRmVl8sjc3Fx4aWXXsLNza1B6xQRuZbZ29vTpk2bi34tPT2dtWvX0r59eyIjI/Hw\n8GDLli3WTMuG4uXlddHXo0aNYtq0adx3332Eh4djb2/fQJWJiIiICOhIuIjYyJkzZ3BwcMBisZCY\nmIjRaATA2dmZYcOGYTQaady4cb3X5efnxzPPPENsbCw7duzAx8fnss96eXlhNpuJjIy01i8iIjVj\nsVjw9vZm5syZzJ07l9zc/AhGIAAAIABJREFUXOvnQGZmJr6+vg1c4X+dOnUKZ2dnrf8iIiIiVwnt\nsBSRWktLSyM5OZkOHTowevRoxo4dy/HjxwkJCaG4uJhly5Y1SLMyOzub7OxsIiMjKS0tvWKzEi40\nNwFMJhMmk6keKhQRuX55eHiQlJREbGwsM2bMwNPTk8OHD3P48OF6b1ZmZ2df9vcMBgP//ve/gf9G\nmIiIiIhIw1LDUkRqLSQkhFatWnHq1CkWLlzIyJEj2b9/v/WHvl9nRNa1oqIi1q9fD1DtzMy0tDTr\nsfH169fz1ltv2bw+EZEbxVtvvcWhQ4fw9fVl9erVjBo1iv3797N///56r+VKnwcDBw4kIiKCiRMn\n8vbbb1svjBMRERGRhqMj4SJiM5s2baJTp04kJibSvXt3Nm3axJo1azh48CAAHTp0qNP5R40axZw5\nc9i3bx/du3ev0RglJSU8//zz1hzLqKgoXcQjIlJFmzZtAmDFihX06dOHxMRExo8fT0ZGBikpKQ1c\n3W9V1jtq1Cjy8vIauBoRERERqaSGpYjYjL+/PxUVFezYsQOA8vJy7rzzTrKysup03sofgocNG2aT\nm13Ly8s5c+YMfn5+2NnZWX+I9ff3r/PvRUTkWlZeXk5sbCwTJ06kS5cuLFq0iKeffpqysjJ8fHyY\nPHkyABEREQ1c6QUmk4nY2FhrfVrjRURERK4OOhIuIjbj6elJTk4OK1euZOXKlTg7O7Njxw4OHDhQ\nZ3NmZ2czaNAgBg0aRFhYmE3GbNy4Mc7OztjZ2WE2m2nUqBEmkwlPT0+bjC8icr2pPEbduHFjkpOT\n8fHxwc7OjjFjxhAaGsrq1avJysoiIiKiTpuVx48f5/jx4xfVdDlms5lnnnkGHx8fPvnkk980K3U0\nXERERKThaIeliNhceno6ALt27cJsNrNhwwaMRqNNLlkoKiqyHtEeNWoUc+fO5YEHHgAgKCio1uNX\nWr9+PeHh4RQWFgIQGhrKwoULcXFxsdkcIiLXq+TkZIqKigA4ceIEJSUlvPnmm3U+b+XnT1U+D8xm\nM3/+858JDQ1l2rRpzJgxw5pjLCIiIiINSw1LEbGpgoICRo0axfjx4zl//jwDBgzgvvvuw2g02iTD\nMiIigtDQUADuu+8+nJycaj3m/9q0aRM7d+7ktttus/7a7NmzSU5O1i5LEZHLKCgoYMWKFQA8//zz\nlJSUAGA0GomMjGzAyi4tIiKC1q1bAxc+TxwdHbn//vsbuCoRERERAbBv6AJE5PrSqlUrli1bxsSJ\nE3n55ZeBC5ft2OrCnS1bttTpxQ0Wi4Xg4GCSkpIuOg64atUq/P398fT0VMaZiMgltGrVypoj3KpV\nK7Kysli+fHm9zF2TjOEtW7awb98+AHr06KG1XUREROQqclVmWObn55OQkNDQZYhIDdjZ2eHi4sJL\nL71EmzZtWL9+Pc2bN2fs2LHk5+dXe7yysjIyMjKs79v6FtfK8Sszz+zt7Xnuued+sxuoY8eOlJWV\nUVhYWKeZnCIi15K0tDTS0tLIzs6mU6dOuLm5UVpayrlz5/jhhx84d+4cc+fOrdH6X1UHDhywXvZW\nHXv37mXhwoW0bdu2DqoSERERkdq4KhuW7u7ualiKXOO2bt3KqVOnGD16ND179qRnz564u7tXe5xT\np06RkpLCyJEja/T+78nPz2fkyJHs378fuPz6k5CQgLu7u/5BRURuaDk5OeTk5Fi/vvXWW/n+++/p\n168fw4cPx8HBgVatWnHq1Cl69uzJjh072LFjR52s35UqP2+qKz8/n3fffZdbb72Vhx56qA4qExER\nEZGaUoaliNQpLy8vvvjiC4BqHQufPXs2mzZtYs2aNXVVGtHR0ZSUlPC3v/2N7t27/+7zn376KQMG\nDKBDhw4YjUbuu+++OqtNRORqEx0dfVHUB8DBgwcxGAxs2rSJ8PBwevToQffu3Tl//jwRERGsX7++\nSutrfdm0aRMAK1euxGw28+mnnwKwePFiXbgjIiIichVRw1JE6pSXlxfTpk0D4PXXX69yRlhpaSld\nunSps+PXsbGxLFq0iJMnT1oz16qiUaNGADg6OrJnzx48PDzqpD4RkatNbm4uc+fOJSkpCX9/fz76\n6CP8/f0pLS0lIyODkJAQ9u3bR2xsLC+//DItW7as1vpaH8rLywE4e/Ysvr6+TJkyBYCYmBjs7K7K\ng0ciIiIiNyRduiMidaoyczIhIYG33nqLdu3akZaWRseOHXF1df3N82VlZWRnZ9OxY8c6aVbm5+ez\naNEibrnlFg4ePFjtH6Yr/43HYDDQsWNHsrKy8PPzs3mdIiJXmyFDhrB9+3bGjh3L+vXr6du3L7Nn\nzwZgypQp/PGPfyQ/P5/k5OQ6q6Eyb/hSnx9V0bhxYxISEujbty/nzp3j6NGjdOzYUc1KERERkauM\n/nYmIvWiT58+bNy4kVOnTvH888+Tlpb2m2eWLFlizayszJS0pSVLltC8eXP69OljzaSsrXfffZf1\n69fboDoRkavT+vXreeutt4iKimL//v3WTOGoqCjr76ekpLBy5Uq2bt0KXFhvba2oqIikpKRafT7k\n5OTg4uJCaGgooaGh1npFRERE5OqihqWI1IuVK1cSFxfHuXPn8PPzIzs7m4KCgoue6dixI8899xxv\nvvkmQUFBNp1/9uzZODo6Ym9vj5ubm83G/emnn2w6nojI1cbNzY0ZM2Zw4MABgoKC2LJlCwUFBbz4\n4ovAhfX90UcfxWAwcPToUeDCem5r9vb2DBkypMqfDwUFBdYdoJVcXFz4+OOPKSwspKioiMWLFyuP\nWEREROQqpAxLEakXpaWl9OrVi9TUVHr06AHAvn37sLOzw9/fn6SkJMLDwzl16pRNM88sFguvv/46\nZ86cIT4+Hk9PT5uMazAYMJlMeHp6Wo+9i4hcrypv4V6zZg2lpaUYDAZatGhBeXk5b731FuHh4fj7\n+7Nnzx4cHR0buNoLKioqOHv27G/q0fotIiIicvXTDksRqReOjo7k5OTg5+fH4cOHGTRoEF5eXtjb\n2zNy5Ei2bt1Kfn6+zS9oqKio4MyZMxiNRps1KwHrkfL8/HzGjh1rzVUTEbneJCQksHXrVhwcHOjb\nty9RUVHk5uZy7NgxvvrqK26//Xa6du3KgQMH6qRZmZCQQH5+frXeyc7Oxs7O7qJ6ysrKSExMxGQy\nAahZKSIiInIV0w5LEal3JpOJlStX4uPjg6+vLwEBAQA2Pwa+ZMkSzGYzhw4dwmg02mzcnJwcVq5c\nyenTp7G3t+fgwYMALFy4EBcXF5vNIyJytZg6dSpxcXHMnDmT0NBQgoOD+eyzzwgODgagd+/eNr9s\nZ8mSJdaczOqaOnWq9ch6JbPZjJeXFwBRUVF1ejmQiIiIiNSOdliKSIMoKChg8uTJODo6smXLFps3\nK+FChtqiRYsYN26cTcaLjo6moKAAo9FIaWkpkydPJiEhgVtuuYWVK1dSWFhok3lERBpa5Xo3bNgw\nNm/ezIsvvojBYKC0tBQXFxcWL17MCy+8gMFgoKio6DfNQVvMX5sczEvVEx0dDcD48eOZM2dOjccW\n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\nPzBz5kwiIyM5ceIE0HHO9u7dC3Ssvr19+3blety3bx9Go1HJnBw5ciTHjh1Tnl4MCwv7ynPcHRqN\nhtTUVOX+7RLntfAAACAASURBVOqx6K6qqirS0tIASE1N7VamZFFREXFxcZhMJuV42jM3g4ODmTx5\nMiEhIRw6dAir1dppyrv9+Nnvt2PHjvX6d5AQQgghhPiBsAkhhLjhGhsbbW1tbTabzWbLysqy7dix\nw9bW1marrq62JSYm2hobG22+vr42o9Foi4uLs9lsNpu/v7+turra5uXlZcvKylJ+lpWVpbzuTYGB\ngTaj0WiLiYmxtbS0OKzda4+HIzU0NNja2tpsmZmZtszMTJvZbLYByi+j0Wjz9/e36XS6Tj8HbJmZ\nmTZfX1+bk5OTzcvLy+bl5WWrrq526Pi+D+zXb2Jios3Ly8sWGBiovBcYGNjp+JWXl9t8fX1tO3bs\nUF6PGTPG1tjYaIuLi7N5eHjYnJycbPHx8baYmBib0Wi0GY3GTuejra3N1tjYaGtsbLSZzWbbmDFj\nbGaz2dbS0mJraGhQ+k5MTFTOV0tLi8OuV/u+dPV6TUxMtDk5OfW4f/v3w7XfJ13h5eVli4+Pt5nN\nZuX7xtnZWdkv+/0dExNjKy0ttdlsNptOp7PpdLoej10IIYQQQoiukCnhQgjRC1QqFU5OTkoupclk\noqioiL59+9KnTx/OnTvH2bNnaW5uZvLkyfj6+lJbW4ufnx+TJk3i3XffxcXFBYCYmBhiYmJ6bexm\ns5mkpCQMBkOPMvegI/OvpqYG6MjgCwoKwmAwEB8f3+UMvm/j4eGBk5MTiYmJJCYm4uXlxb/+9S8C\nAwPJzc3F39+fM2fOUFNTg4+Pj/Le0qVLmT9/PqNHj+Z///d/qa+vp76+nvb2dkaNGkV0dDRms1nJ\nF/2uZ2Lax28wGDqdH4PBQFlZGenp6UpGYVlZGZmZmeTl5WEwGDh16hQvvfQS99xzDz//+c+VTMXM\nzEx27drFiBEjmDRpEkVFRfzud79j586dmEwmysrKGDFiBLt372bLli288847/PWvf6WtrY0dO3Yo\nmYn+/v7YbDYSExOprq5WMiJVKhVeXl6Ul5crmZPXLraUmZlJQkICtbW1rF+/3iEZr2q1GqvVSlJS\nUpev1/79+zNmzJhu9avX60lPT2fatGkkJiai0+mU75PrZc/4tVqtHDp0iMDAQC5cuMDMmTN57LHH\n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\n" } }, - "id": "2ca5a564-69be-483f-8011-a6c398611952" + "id": "7bed3d4c-4a8c-41ed-a647-1a449105469b" }, { "cell_type": "raw", @@ -595,7 +595,7 @@ "source": [ "<!-- the svg (inkscape) graphic is included in this folder, in case it needs to be modified -->" ], - "id": "e8ddfcfb-4fa0-4a1f-8bf5-95486d0f213b" + "id": "da3654f2-c8cf-4188-b7b6-3ca53a560c8f" }, { "cell_type": "markdown", @@ -825,7 +825,7 @@ "image/png": "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\nw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JH\nkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQl\nw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlw8JHkiQlYxj4wxLvvw74aon3lyRJCRkGPlfi\n/ddi4SNJkqbJMHAWsDMwB9gN2At4RXZczw3AKuApYFODa3YF5mWP5wNHAyN1rntOdu+tbWUvSZIA\n9gbeUuL9bwC+W+L9mzYMnFvn/D7AGmB+zfkHgRcD21q8zyzgBOCvsvdXzAAWA3e3GE+SJI1bDHy8\nxPv/J31U+NRzH3ATsLTO+VaLHoDNwGXZ4yzgY7nXRrHwkfrBPOAYohV3MbAQmAk8AzwG3A/cAawG\n1peUo5SqtcTfV4j/q3OJ/6snADvVuX4H8HXgJ8DTk8TdOYu3G3AYcFSDePu1lXUJGhU+AE/UOddO\n0VPr40Q32vuz49ECYkrqjlHgFGA5sITxmaDrgF8AjwDPAvYE9she20E0e38DuAj43+lLV0rWL6jf\ng7OUGJ5S63LgjW3cZzbwJuJv+Aty50fbiFWKyaaz7+jifT8C3Jk937eL95HUnmOAbxKtsR/OjtcC\n7yW+9T0LOIL4NnkE8GzgIGAFcFd2/d9kzy8Djpve9CVlrqb+eNx2v5BsIr7QHAp8KXd+d2J8b88r\nax2fLcA/Zc9HS8pB0kTPAv4Z+BFwIvEZ8STwR8CBwHlE03g9twN/BxwCvBV4OHv/a4EfEh+SezR4\nr6Tu6UYPznbi//lluXOjHcacFmUuYPgfRKvSaIk5SBr3cuBm4FRgKDu3hmi9+RzNz758hiiejgGu\nz84NEV1mNxOzRiVNn7Euxd0BnEmM44U+6cEps/C5H/gZffIPJQ24k4gZGXvlzq0BXkZ0V7VjLTG+\n4Ie5c3sC3yGKK0n97x7g0uz5aIl5NK3sLStWE2v51BshLml6vJ7ohto5d+5B4HXEel2d2AS8gSiC\nKnYCLgRO6zC2pN7wlexnXzRklF343EhMh92n5DykVB1JfGjNrDl/BrF8RREeJMYI5Q0BFwDHFnQP\nSeW5kujiHi05j6aUXfhUmtD7okqUBszOwL8RC4zm/Qi4pOB7XQ58v879/7XO/SX1lw3E5IbRkvNo\n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\nLV5Sew4FLiTGqc7NHpNttTSLGOv3WeIzYSPR47MB2Ebs4XdN99IFIuf82OGr6byH5TeAM3PH7wO+\nlb9gmIk7M7fj8akvKdSymuMixuCcSnVB9QFsetfgWk0MXL6JmLV4L/W//MzPfh5Ca4XP84gvQrsC\n7615bSbxgbwvsQHwbBzfI3VqDtU9OI9T/bd5jPGFeOcycdzPCDGOt2IB3Vf0+J7jiV6aSiPMudmj\nSq8MbmrFMNXje+6l8/E9BxCr1lb8K3X+saQBspoY/Lc7E6d81rMfrX0oVcYPvLnJ+BY+Umd+TLS0\nrqeznoqdiMJow1QXFmBZzfGqDmItJwYwzyGKvLOA8+pd2I+FzzFU75u1qsN4+wKX52J+g+gPdECz\nBlmrhcZuU19SZa8Wr7d1VerMdorpfdlWUJypzKB6/Z6HaW98z+7A3wFvyY7XAacRf9cb3rjfLKs5\nXtVBrKOB7xNjEQC+SExn39ZBTKkfrAG2tnB9vcGRk9mlhWufYXzqvKQ0LKF6tlmr+3PtSQxJuZXx\noudiYvPyhkUP9GeLTxF9grOIafnvIf4NNgPvZvJF3aRBsgU4g+ZacrYT3b+t+DLxf6uZz5j1wNMt\nxpfUXxYTXeaziDGA76p5fSfgFdSf5DBMfFYtIgqblxLjeWYQkzAuI2Zy/aiZRPqt8NmFieN7ft7C\n+xcSKzmuIBZMA7iKmLVye+fpSX3lgi7Gfgj4ZBfjS+ofQ8Saf5O1BC/PHs3YAlwLfIf4UnZfK8n0\neuGzJ3AQMbp8EXAK1f9wG4l/qEbfFmcTxc7BwHFE0VQZyf59Yvr6dwrPWpIkVYwBrySWz2m127xi\nM9Ea9CCxl2C7y+/0fOHzFSbum5V3MFMvjlaxhRjQeUUW99bOUpMkSU36YdkJVPR64XMaMdW8ExuA\nx+iwQpQkSf2v1wufn9PaGB5JkqSG+nE6uyRJUlssfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJ\nUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIs\nfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJ\nUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIs\nfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJ\nUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjIsfCRJUjKGy05ALDn//POfKDsJSVLrhoaG\njhgbGys7DbXAwqd878oekqQ+Y9HTf+zqkiRJybDwkSRJybDwkSRJybDwkSRJyXBw8/S5C1hQdhKS\npGlxT9kJSJIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk\nSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZI0CIbKTkDSlHYCLi7x/ncB7yvx/pIkKSEjwFiJ\nj7Xd/xUlaXrY4iP1viFgCdHyMxdYAOwNnAIc2+A95wFXAU8BWxpcMxeYD8wDDgReCrwY2KXmuh3A\nbGBr27+BJElSh0aAXzKxhWZNBzEXAecAm2piHtBRppIkSQW4homFz8oC4r6CaC2qxDyhgJiSVLoZ\nZScgqSMb6pzbUUDcq4DTc8ejBcSUpNJZ+Ehq5GLgh9nz0RLzkKTCWPhIamQM+Hz2fN8yE5Gkolj4\nSJrMpcA2YL+yE5GkIlj4SJrM48At2OIjaUBY+Eiaympi3aCRshORpE5Z+Eiayhris2Jx2YlIUqcs\nfCRN5e7s52iZSUhSESx8JE3FwkfSwBguOwFJPe8uYCGxjYUk9TULH0lTGSNmd0lS37OrS5IkJcPC\nR5IkJcPCR5IkJcPCR5IkJcPCR5IkJcNZXZK6aRGwDzBU57VNxFT5rS3EGwIOyd6zGdiQPYaAOcA8\nYFb22r1tZy1JknrS5cR08/zjylIzGjcDeJqJ+eUfX2gx5olTxKs8tgAzO/4NJA0cW3wkdcsO4DXE\nHl97ZT/fRXVBchpwDnBPkzGvAX4LeB5wEnBk7rW1wDeBO4HrgWc6yF2SJPWgXm7xqXUgkd9WqvO9\noM14s4liZ4z4d5hdQI6SBpyDmyVNl6XZz7Opbo05jfZ2ft8EPEB0a52KW2pIaoKFj6TpspTo/vo8\n8JXc+Z2Bv2gj3hxgCfA9YF3H2UmSpJ7XT11d9wE3Zs8PJlp9KjlvAvZuMd6rsveuKCpBSYPPFh9J\n0+EAojtrZXZ8K3Bp7vVZtF7AVLrOVnWUmSRJ6hv90uLzNiK31+XOHUF0fVXy3gDs0ULMa4ld4522\nLqlptvhImg5Lia6ta3PnbgYuyx3PAc5sMt5s4Fjgapy2LklSMvqlxefnxNo6tZZQ3erzJLBbE/F+\nNbv+3QXlJykRtvhI6rb9gH0ZH9+TdwNwRe54HvCnTcR0fI8kSQnqhxaf3yfy+vUGrx9Pdf5PAPOn\niLkSeBS/vElqkR8akrptKbAd+EGD16+jujVoPnD6JPFGgBcR21fsKCJBSemw8JHUbUuB1cD6Sa75\ncM3xe4C5Da49jhjcfHXnqUlKjYWPpG5aDIwCV01x3UqqZ3ztDryjwbWO75EkKVErmTjGp1GXUhlO\nJXI6oYlrX0317/FL6m88+l0c3yNJUnKGiGnitYXP/fTOon5fJDYRndPk9T+g+nf5k5rXdyIWOvxq\nUQlKkqTes1v22A84jJgh9Z9MLHryM7t+j1jk7yBgn1yMWdOY993EIORmnUj173EfsYlpRWUGWLML\nHUqSpD4zQuMCp53H2dOU93Oz+32oxfddT3W+b8+9dlZ27ogiEpSUnuGyE5A0pTHgFmArMTNqO7HW\nTbMWEN1ilZ+PFZ1gA8uyn/UWLpzMx4BLcsd/CVxI/N5Lifxv6TA3SZKkQn0e2ET9AcqTGQLWUN3q\n8xbii9p6qosiSZKknnAHU09jb+TNVBc+dwAvyZ43s6WFJEnStNmbKFI+0Ob7ZwK3UV38XJf9PLyI\nBCVJkopyMlGkvKyDGJU1gPKPdbh+jyRJ6jFfBDZTPRW9VcPAXVQXPo7vkSRJPWU3YubVvQXEejvV\nhc8ZBcSUJEkqxCLgCqJI2Qw8v8N4OxMFVKXwOazDeJIkSR05FfgCsVv6JqpbaDYA3wDOAw5tM/7p\nWaxHiKnukiRJpbkZeJro3rob+Gl27m7gIeBJYvHFk9uMPwL8DPhsx5lKSt7/AZrgXmB0lF4uAAAA\nAElFTkSuQmCC\n" } }, - "id": "831a0b2f-90ab-4913-9545-1cdd6f40d7fc" + "id": "1c360b7a-042e-4762-9bdc-3c209955f8b8" } ], "nbformat": 4, diff --git a/public/content/exercises/homework02.pdf b/public/content/exercises/homework02.pdf index b41b31d92ef31f31140e63a9b89ab306a800ea12..e1ac39503fd12085d8b83d464b63980a59034570 100644 Binary files a/public/content/exercises/homework02.pdf and b/public/content/exercises/homework02.pdf differ diff --git a/public/content/exercises/homework03.ipynb b/public/content/exercises/homework03.ipynb index eac24bc5260338417370017bf8947a77c3276415..459337a43ce42b9ef01d22fd6bfd1d56d1f99251 100644 --- a/public/content/exercises/homework03.ipynb +++ b/public/content/exercises/homework03.ipynb @@ -299,7 +299,7 @@ "> The subscripts before the comma denote the components. The subscript\n", "> after the comma denote the derivatives." ], - "id": "b44c62e0-9b78-455b-84bc-a645b2a6ac7c" + "id": "124ff2b2-7eee-4369-9149-a54165e3fa98" } ], "nbformat": 4, diff --git a/public/content/exercises/homework03.pdf b/public/content/exercises/homework03.pdf index 78361b1c1b20acbe12673f50c5b1f1297b2fe739..a58825e4ad3af53f5a8ff5ed2a6a1649c1f17d77 100644 Binary files a/public/content/exercises/homework03.pdf and b/public/content/exercises/homework03.pdf differ diff --git a/public/content/exercises/homework04.ipynb b/public/content/exercises/homework04.ipynb index 04c20d441bb5d2a5a5c12616759845476c44e394..55e192a7eefe522b4fccf4cf755ec64bb6f6ec92 100644 --- a/public/content/exercises/homework04.ipynb +++ b/public/content/exercises/homework04.ipynb @@ -131,7 +131,7 @@ "image/png": "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\n" } }, - "id": "b3a36b1a-a8ec-425f-b1e2-dac3d14bcc80" + "id": "e48d490c-5333-40e4-a19c-4e64611cd4cd" }, { "cell_type": "raw", @@ -141,7 +141,7 @@ "source": [ "<!-- {{< include /content/problems/problems/p-karman_vortex/all.qmd >}} -->" ], - "id": "8835856a-39d3-47da-83f3-2523ea891071" + "id": "4afc05c4-d3f3-4283-be11-cb8e7ce809c1" }, { "cell_type": "markdown", @@ -257,7 +257,7 @@ "\n", "Describe in your own words what the different equations model." ], - "id": "705cdaf3-ab9c-430d-9953-d0e59461b323" + "id": "fb54f796-91c2-4c26-b5e3-1e990d7f3e7c" } ], "nbformat": 4, diff --git a/public/content/exercises/homework04.pdf b/public/content/exercises/homework04.pdf index 1503989cdb13f8dabc7242785543e27f99f0100f..5a47b0be3aa7e5fc44c7c0a67656539567f8a8a4 100644 Binary files a/public/content/exercises/homework04.pdf and b/public/content/exercises/homework04.pdf differ diff --git a/public/content/exercises/homework05.ipynb b/public/content/exercises/homework05.ipynb index fa7d4c6d7ca3b5e4b21a5246da454ae1fd531395..921a8dd7fe3e8299503eed8c930e291479dbeac1 100644 --- a/public/content/exercises/homework05.ipynb +++ b/public/content/exercises/homework05.ipynb @@ -214,7 +214,7 @@ "> notebook (and the correpsonding folder `swe` from there). The only\n", "> python dependencies of this notebook are `numpy` and `matplotlib`." ], - "id": "507d4141-6f30-4504-8347-8d6436a9fbaf" + "id": "f3c30828-04bc-4ce1-9639-4d0613638c05" } ], "nbformat": 4, diff --git a/public/content/exercises/homework05.pdf b/public/content/exercises/homework05.pdf index be0fae9cd6e97bf3b8d4a1c6e99644e50e18a606..849800fd7aeb5a9d6818de7c94f0a6888ffb23e4 100644 Binary files a/public/content/exercises/homework05.pdf and b/public/content/exercises/homework05.pdf differ diff --git a/public/content/exercises/homework06.ipynb b/public/content/exercises/homework06.ipynb index a1659003535737209958cc932b33fb77d974d2cc..b43423ee1b83d35bffd7f84209fd3e7e99c490fc 100644 --- a/public/content/exercises/homework06.ipynb +++ b/public/content/exercises/homework06.ipynb @@ -173,7 +173,7 @@ "image/png": "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\njzwGAEB6/wefOMY/l5JMtwAAAABJRU5ErkJggg==\n" } }, - "id": "18ba8966-49a9-44bf-a13e-a6dd53318567" + "id": "222ec283-39c9-4da9-8c82-e5eadca4f4bb" } ], "nbformat": 4, diff --git a/public/content/exercises/homework06.pdf b/public/content/exercises/homework06.pdf index b3871195fd1c75dbc5e8ff37b43a3488747921e2..a098aa695ae31dc5ebc5601713df0bd7d3ef24cb 100644 Binary files a/public/content/exercises/homework06.pdf and b/public/content/exercises/homework06.pdf differ diff --git a/public/content/exercises/homework_template.ipynb b/public/content/exercises/homework_template.ipynb index 2b23d635353b595715f5c334b63802e6801980cc..582c4986cdce5c3834e7df2aa9e9ba5bd30291c5 100644 --- a/public/content/exercises/homework_template.ipynb +++ b/public/content/exercises/homework_template.ipynb @@ -86,7 +86,7 @@ "image/png": "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\nqyRp6dKl8vX1NZwIAOqGM5UBAPV25513ys/PT1FRUaajAAAAwE189dVXOnDggOkYDaKsrEzr1q3T\n7bffLm9vb91///3KzMzUzTffrOLiYtPxAOAnMVQGANTb3/72N73++utauXKl6SgAAABu6dSpU6Yj\nNLjS0lKdOHHCdAynCwkJ0e7duzVs2DDt379f7du3V2ZmpkpKSvT444/Ly8tL586d0+nTp3X69Gmd\nO3fOft3vXwaAhsZQGQBQbzfeeKPpCAAAAG5r/fr1uu666/T555+bjgIHKiws1IoVK3T77bdr6tSp\n2rdvn/bt26fExEQtWbLEvkfIww8/rMLCQo0dO1bJyclaunSpfY3k5GQdP35cK1as4OcDgBEMlQEA\nAAAAaIRGjx6tkpISvfbaa6ajNKjw8HD17t3bdAyn2bhxox544AG1atVKf/3rX3XttdfqySef1D//\n+U/96U9/0tChQzV06FC98847kqTt27frtttu01/+8hdNnDhREydOVEFBgV588UU9+uij+uCDDzRx\n4kSVlpbqueeeM3zvADQVbNQHAKi3zz77TJmZmaZjAAAAwE1kZWXpkUce0YEDB3TDDTeYjuNUDz74\noKKjo3XHHXdIkh599FHdcsstOnjwoBISEiRJ7733nrp27ao333xTxcXFmjt37kVrrF+/XitWrNCh\nQ4dUVlam2267TQkJCZoxY4YiIiKUlZXV4PcLQNPQrKampsZ0CACAa8rLy9OLL76olJQUeXh4mI4D\nAADg8k6ePKmMjAyNHTtWkhQaGqrdu3cbTtVwmjVrpmHDhrnt68u8vDzdeOONSklJ0YwZM5SVlaUF\nCxbo9OnTevfdd3XkyBG1adPmR69bWz134c/DjTfeeNHla665RmfPntWcOXP02GOPqXlzPqAOwDl4\ndgEA1NuNN96ojIwMZWRk/OjX169f38CJAAAAXNs111yjsWPH6qabbtLgwYOb1EBZkn7zm99c8vWl\nq7v11lt10003STp/X1944QXdc889Kiws1Jw5cy65Z8nu3bt/8PPw/cvfffed3njjDXvnMgA4C/UX\nAIB6e/XVVyXpJzvvCgsLGzIOAACAy1q6dKlycnLsl5988knFxsaaC2RIUlKSQkJCTMdwiueee07+\n/v568sknJZ2/r2VlZYqPj9fGjRu1ceNGWSwW+89BeHh4vW6nd+/eSktLk7+/v8OyA8D3caYyAKDe\n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\nODg4oLm5GW+++SaKi4vh4eGBNWvWPNH76+vrsXz5crS3t2Py5Mk4ePAgPvroo24utYnu5ODBg7h2\n7RpOnz6NDz74AF9++SXGjRtn6B8EPkcAACAASURBVGJ1Cr2/ef/99/HZZ591OsftzcybNw+nT59G\nSkoK7OzsDF0cbN++HRcvXgQA8Hg85OTkPNX86WkIDg7utnwxa9YsmJubIygoCHV1dXjzzTe7/Bz9\nBaVSiS+++AIvvvgi5syZg3HjxvXafPC86F/PUlJSsGrVKqN9/qNPQ0MDdu3ahRs3bgAARo0aZXoG\n1IcwI4QQQxfC2OH+t0+lUj32v0lhYWHIzMyEfpNXV1cjIiICly5dwu3btwEAI0eOBACcOXPG6P87\nVV1djU8//RSzZs1CREQEvL29YWZmhsmTJ2PNmjVG7wgy8Xw0NTXh2rVr8PHxMXRRTHQBTU1N+Oyz\nz7Bz507cvn27Q74z8etQpz7wyHW4ZMkS5tifPXu2gUvXP7l9+zZ27tyJl156CTKZDGvXrjXlq/9A\n5z8+Pj64du0aXn31VVy7dg2TJ0/GkiVLjO4hi4mepbq6GgEBAYiNjcWZM2fw0Ucf4fXXX0dmZuYT\n5bumpibEx8fDx8cHZ86cAYBe79018evQ+6Br167B39/fwKX5bfTv24yJ3jb/Li8vZ9/OysjIQHh4\neJcePyIigjmve2I+ZWZmhpEjRz5xPjPRkdu3b+PSpUuYPXs2rK2tDV2cbiMiIgLl5eX49ttvIZVK\nERoayj6d3Veg1/vLly8DgOn+sK9hOPNG34E6oPAfJ9zjePjwIXFzc+vgiKLOYe5PSEgIaWhoMErn\nkT4qlYo5os3MzIhSqSShoaHk4cOHzLnKdZJRoqOjiVqtZs4r6rC2tbXVceiZMC6e15HW2fs7i5++\nilqtZuNArVYTQn69/o/bn/7t1/rDy8uLeHl5sePTfX/rfFZWViQtLY00NDQ8T1Ufe/y+NP47ux7Q\n/Ojm5sactZ05Gp9kLHXmHNV32tN4oPHRGdw1BPT7vz+Mv9DQUKJSqfqFx++34PY3na+EhIQQpVJJ\nlEpln5q/mOhe6PyXOlTp9tM4aVtbW0lraytpbGw0jU8TJowYOt+h99Nd7VQuLS3t0TURuI7oX5tf\nmegIvf/oLzQ2NrL5E43PvnY9a29vJ2lpaSanch/F5FTuArheH61Wi5KSkk73W7ZsGW7duoWcnBwA\n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\nZ8/Oyy+/nKuvvjo7d+78yOd/YHCwUpl+t3z58iTJvHnzMn369L77j81AHj16dKZPn5558+YlST77\n2c9mwYIFSZLm5uasXLky06dPT1tbWyZPnjzwFwCcsk2bNmXu3Ln5yU9+0vf6BgAAKltPT0/uvvvu\nzJo1q68sbmpqSnL08/7777+f5ubmvvMXLFiQP//5z339wLJlywY+NHBSbNRHv1u1atXH3n/sTeK5\n557LSy+9lOXLl2fNmjVZunRpDh06lCRZvHhxrrjiiiTJyJEjByYw0O/WrVuXrq4uK5UBAGAIaGlp\nyR133JGRI0dm9OjRaWlpSX19fZ577rm+c5qamlJVVdV3vGbNmjzzzDPZtm1bZsyYkeuuu66I6MBJ\nslKZQhw5ciSNjY35zW9+k56entTU1CRJ/va3v6WhoaHYcMApa2xszNq1a+MtBgAAKt/hw4fzmc98\nJlOnTs2KFSvS2NiYJLniiiuO22PlwIEDaW9vz5IlS7Jnz57MnDkz3/nOdzJixIj89Kc/TRJ7ssAg\nYaYyhaipqcnFF1+cd999N8nRkvnCCy/sK5eByjBnzpyiIwAAAKfZP//5z1x00UUZM2ZMDh48mJaW\nlowdO/YjBfGoUaNyzz335MEHH8xtt92W6urqjBs3Lo8++mj++te/pq6uLl1dXenq6iroSoByKZUp\nTHNzcx544IEkyeTJk/P0009n7NixBacC+tPtt99edATK1NbWVnQEAAAGqZUrV2b//v350pe+lCef\nfDJvv/32//tZoLm5OTt27MhXv/rV7NmzJ/Pnz8/SpUtz00035fHHH8/jjz+enp6eAbwC4EQplSlU\nU1NTnnvuuTz55JPHbepH/1i0aFFuu+22vltnZ2cWLVqU5OjMq87OzoITUunq6uqKjkCZ/F0BAHCq\npk6dmu9973t577338v3vf/9Tz29ubs7f//73LF++PK+99lrGjx+fs846K2eddVaGDbMNGJzJzFSG\nCrFkyZK0t7cfd19PT08++OCDvuNSqZSDBw+mVCr1zbxqaGgws4p+Z6YyAAAMHY2NjVmxYkW+9a1v\n5bvf/W4OHTqUBQsWpLr609cyHjlyJPPnz8+6desyatSofO1rX0tra6vxmHCGs1IZKsDatWvz2GOP\n5cCBA8fdLr300tTU1GTKlCmpra1NXV1dLr300lRXV2fkyJGpq6vLn/70p1RVVfXdjhw5ko6OjqIv\n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\nAICy/S9GeoUSeELglgAAAABJRU5ErkJggg==\n" } }, - "id": "145ef8e1-f148-4e96-8265-2783c58cbf73" + "id": "11af10f9-28ec-42b5-b8fa-ff1bb9912ded" } ], "nbformat": 4, diff --git a/public/content/exercises/homework_template.pdf b/public/content/exercises/homework_template.pdf index 3e11abdc9571d9df78181d648985ee62ffc29e4b..2af81fd43fb007eac07e5260fdfaecdc2b1c06dc 100644 Binary files a/public/content/exercises/homework_template.pdf and b/public/content/exercises/homework_template.pdf differ diff --git a/public/content/exercises/intro.html b/public/content/exercises/intro.html index 85c09332acf4a26028f71f5ab0e4a552ec948378..d40fa23e7aad7083dbe4de3ceb47a9c8ee23e250 100644 --- a/public/content/exercises/intro.html +++ b/public/content/exercises/intro.html @@ -282,48 +282,35 @@ window.Quarto = { <li><a href="#post-processing-with-paraview" id="toc-post-processing-with-paraview" class="nav-link" data-scroll-target="#post-processing-with-paraview">Post-processing with Paraview</a></li> <li><a href="#verification-comparing-with-the-exact-solution" id="toc-verification-comparing-with-the-exact-solution" class="nav-link" data-scroll-target="#verification-comparing-with-the-exact-solution"><em>Verification</em>: Comparing with the exact solution</a></li> </ul> -<div class="toc-actions"><ul><li><a href="https://git.rwth-aachen.de/mbd/courses/cmm/issues/new" class="toc-action"><i class="bi bi-git"></i>Report an issue</a></li></ul></div></nav> +<div class="toc-actions"><ul><li><a href="https://git.rwth-aachen.de/mbd/courses/cmm/issues/new" class="toc-action"><i class="bi bi-git"></i>Report an issue</a></li></ul></div><div class="quarto-alternate-formats"><h2>Other Formats</h2><ul><li><a href="intro.out.ipynb" download="intro.out.ipynb"><i class="bi bi-journal-code"></i>Jupyter</a></li><li><a href="intro.pdf"><i class="bi bi-file-pdf"></i>PDF</a></li></ul></div></nav> </div> <!-- main --> -<main class="content" id="quarto-document-content"> +<main class="content" id="quarto-document-content"><header id="title-block-header" class="quarto-title-block"><nav class="quarto-page-breadcrumbs quarto-title-breadcrumbs d-none d-lg-block" aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="../../content/exercises/index.html">Exercises</a></li><li class="breadcrumb-item"><a href="../../content/exercises/intro.html">My first FenicsX program</a></li></ol></nav><h1 class="title display-7">My first FenicsX program</h1></header> -<header id="title-block-header" class="quarto-title-block default"><nav class="quarto-page-breadcrumbs quarto-title-breadcrumbs d-none d-lg-block" aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="../../content/exercises/index.html">Exercises</a></li><li class="breadcrumb-item"><a href="../../content/exercises/intro.html">My first FenicsX program</a></li></ol></nav> -<div class="quarto-title"> -<h1 class="title">My first FenicsX program</h1> -</div> - - - -<div class="quarto-title-meta"> - - - - - </div> - +<header id="title-block-header"> </header> <p>This notebook gives a small introduction to FenicsX, an open-source FEM library. We use the Python API of FenicsX to solve an example PDE problem.</p> -<section id="learning-goals" class="level3"> -<h3 class="anchored" data-anchor-id="learning-goals">Learning goals</h3> +<section id="learning-goals" class="level2"> +<h2 class="anchored" data-anchor-id="learning-goals">Learning goals</h2> <ul> <li>Understand the basic structure of a FenicsX program</li> <li>Learn the basic building blocks of modern FEM software: <strong>mesh</strong>, <strong>function space</strong>, <strong>boundary conditions</strong>, <strong>weak form</strong>, and <strong>solvers</strong></li> </ul> </section> -<section id="poisson-model" class="level3"> -<h3 class="anchored" data-anchor-id="poisson-model">Poisson model</h3> +<section id="poisson-model" class="level2"> +<h2 class="anchored" data-anchor-id="poisson-model">Poisson model</h2> <p>In this example, we solve the classical Poisson equation for a scalar <span class="math inline">\(u\)</span>,</p> <p><span class="math display">\[ -\Delta u = f \text{ in } \Omega = \left[0, \,1\right] \times \left[0,\,1\right], \quad u = g \text{ on } \partial\Omega \quad , \]</span></p> <p>where <span class="math inline">\(\Omega\)</span> is the domain of interest, <span class="math inline">\(f\)</span> is a given scalar source term, and <span class="math inline">\(g\)</span> is a Dirichlet boundary condition.</p> </section> -<section id="structure" class="level3"> -<h3 class="anchored" data-anchor-id="structure">Structure</h3> +<section id="structure" class="level2"> +<h2 class="anchored" data-anchor-id="structure">Structure</h2> <p>Below, we learn how to</p> <ol type="1"> <li>create a mesh for a simple domain</li> @@ -334,8 +321,8 @@ window.Quarto = { <li>visualize the solution</li> </ol> </section> -<section id="lets-go" class="level3"> -<h3 class="anchored" data-anchor-id="lets-go">Let’s go!</h3> +<section id="lets-go" class="level2"> +<h2 class="anchored" data-anchor-id="lets-go">Let’s go!</h2> <p>First, we import some of the necessary python libraries</p> <div id="67992112" class="cell" data-execution_count="1"> <div class="sourceCode cell-code" id="cb1"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> mpi4py <span class="im">import</span> MPI</span> @@ -360,8 +347,8 @@ window.Quarto = { </div> </div> </section> -<section id="mesh-and-computational-domain" class="level3"> -<h3 class="anchored" data-anchor-id="mesh-and-computational-domain">Mesh and computational domain</h3> +<section id="mesh-and-computational-domain" class="level2"> +<h2 class="anchored" data-anchor-id="mesh-and-computational-domain">Mesh and computational domain</h2> <p>The basis for our discretization is a discrete approximation <span class="math inline">\(\Omega_h\)</span> of the computational domain.</p> <p>Here, he have the choice between different discretization types, e.g. quadrilateral, triangular etc.</p> <div id="69e562fe" class="cell" data-execution_count="2"> @@ -373,15 +360,15 @@ window.Quarto = { <span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> </div> </section> -<section id="the-variational-problem" class="level3"> -<h3 class="anchored" data-anchor-id="the-variational-problem">The variational problem</h3> +<section id="the-variational-problem" class="level2"> +<h2 class="anchored" data-anchor-id="the-variational-problem">The variational problem</h2> <p>A key step in building finite element methods is the weak form of the PDE, upon which the discrete variational problem is based.</p> <p>In all cases, the weak form is obtained by multiplying the PDE with a test function <span class="math inline">\(v\)</span> and integrating over the domain <span class="math inline">\(\Omega\)</span>.</p> <p>Further operations on the resulting integral equations, such as integration by parts, can then be applied. This is often done improve the properties of the method, for example to - reduce the required regularity (<em>we need less derivatives of the solution to exist</em>) and hence allow for lower-order (<em>=cheaper</em>) finite element spaces - introduce symmetry to the (bi-)linear forms, which is favored by many linear solvers - introduce certain natural boundary conditions, e.g. the terms that appear as boundary integrals in the weak form</p> <p>A first key realization is that the weak form for a given PDE is <strong>not</strong> unique.</p> </section> -<section id="a-weak-form-for-the-poisson-equation" class="level3"> -<h3 class="anchored" data-anchor-id="a-weak-form-for-the-poisson-equation">A weak form for the Poisson equation</h3> +<section id="a-weak-form-for-the-poisson-equation" class="level2"> +<h2 class="anchored" data-anchor-id="a-weak-form-for-the-poisson-equation">A weak form for the Poisson equation</h2> <p>A typical variational problem for the Poisson equation is given by</p> <p>Find <span class="math inline">\(u \in V\)</span> such that <span class="math display">\[ \int_\Omega \nabla u_h \cdot \nabla v_h \, dx - \cancel{\int_{\partial\Omega} \mathbf{\nabla} u_h \cdot \mathbf{n} \, v_h \, ds} = \int_\Omega f v_h \, dx @@ -389,8 +376,8 @@ window.Quarto = { <p>The discrete variational problem is obtained by replacing the continous domain <span class="math inline">\(\Omega\)</span> with its discrete approximation <span class="math inline">\(\Omega_h\)</span> (<em>our mesh</em>) and the continuous trial and test spaces <span class="math inline">\(V\)</span> and <span class="math inline">\(V_{0}\)</span> with the discrete finite element spaces <span class="math inline">\(V_h\)</span> and <span class="math inline">\(V_{h,0}\)</span>, respectively.</p> <p><em>Technical note:</em> By default, FenicsX test functions are zero on parts of the boundary where Dirichlet conditions are applied. Since we only use Dirichlet condiitons in this example, we don’t have to worry about the boundary integral term and we omit the <span class="math inline">\(V_{h,0}\)</span> notation.</p> </section> -<section id="our-first-finite-element" class="level3"> -<h3 class="anchored" data-anchor-id="our-first-finite-element">Our first finite element</h3> +<section id="our-first-finite-element" class="level2"> +<h2 class="anchored" data-anchor-id="our-first-finite-element">Our first finite element</h2> <p>The term “finite element” refers to the basis functions defined on our mesh. The idea of the finite element method is to find the best approximation of the solution <span class="math inline">\(u\)</span> in a finite-dimensional function space <span class="math inline">\(V_h\)</span>.</p> <p>We thus have to pick a finite element function space <span class="math inline">\(V_h\)</span> on our mesh.</p> <p>Typically, the choice of the function space is crucial for the accuracy and convergence of the method (<em>lego block analogy</em>)</p> @@ -451,8 +438,8 @@ window.Quarto = { </div> </div> </section> -<section id="from-math-to-code-the-weak-form-and-ufl" class="level3"> -<h3 class="anchored" data-anchor-id="from-math-to-code-the-weak-form-and-ufl"><em>From Math to Code:</em> the weak form and UFL</h3> +<section id="from-math-to-code-the-weak-form-and-ufl" class="level2"> +<h2 class="anchored" data-anchor-id="from-math-to-code-the-weak-form-and-ufl"><em>From Math to Code:</em> the weak form and UFL</h2> <p>The main advantage of software like FenicsX is that it provides a way to work in a syntax that is very close to the mathematical notation of the weak form. The underlying syntax is called <strong>UFL</strong> (Unified Form Language) and is a domain-specific language for finite element variational forms.</p> <p>Let’s see how we can write the weak form in UFL.</p> <div id="5804d191" class="cell" data-execution_count="5"> @@ -474,8 +461,8 @@ window.Quarto = { <span id="cb6-16"><a href="#cb6-16" aria-hidden="true" tabindex="-1"></a>weak_form_rhs <span class="op">=</span> f <span class="op">*</span> v_h <span class="op">*</span> dx</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> </div> </section> -<section id="boundary-conditions" class="level3"> -<h3 class="anchored" data-anchor-id="boundary-conditions">Boundary conditions</h3> +<section id="boundary-conditions" class="level2"> +<h2 class="anchored" data-anchor-id="boundary-conditions">Boundary conditions</h2> <p>There are a couple of ways to apply boundary conditions in FenicsX. We cover the simplest way to set Dirichlet boundary conditions.</p> <p>The basic idea is to tell FenicsX where we want to apply the Dirichlet boundary condition in terms of the mesh and then let the software figure out which nodes and facets of the mesh coincide with that geometrical location.</p> <p>We therefore start by defining functions to tell FenicsX what we consider to be the left and right boundary of the domain (<span class="math inline">\(x=0\)</span> and <span class="math inline">\(x=1\)</span>).</p> @@ -525,8 +512,8 @@ window.Quarto = { </div> </div> </section> -<section id="assemble-and-solve-the-linear-system" class="level3"> -<h3 class="anchored" data-anchor-id="assemble-and-solve-the-linear-system">Assemble and solve the linear system</h3> +<section id="assemble-and-solve-the-linear-system" class="level2"> +<h2 class="anchored" data-anchor-id="assemble-and-solve-the-linear-system">Assemble and solve the linear system</h2> <p>We start by creating a discrete function to store our solution vector. The function lives in the same approximation space as our trial function <span class="math inline">\(u_h\)</span> and is initialized to zero:</p> <div id="fb6042bc" class="cell" data-execution_count="8"> <div class="sourceCode cell-code" id="cb10"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>discrete_solution <span class="op">=</span> Function(V_h)</span> @@ -556,8 +543,8 @@ window.Quarto = { </div> </div> </section> -<section id="this-is-where-the-magic-happens" class="level3"> -<h3 class="anchored" data-anchor-id="this-is-where-the-magic-happens">This is where the magic happens</h3> +<section id="this-is-where-the-magic-happens" class="level2"> +<h2 class="anchored" data-anchor-id="this-is-where-the-magic-happens">This is where the magic happens</h2> <p>We now reap the true benefit of modern FEM backends: we can assemble the linear system and solve it in a single line of code.</p> <div id="06034319" class="cell" data-execution_count="10"> <div class="sourceCode cell-code" id="cb14"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.fem.petsc <span class="im">import</span> LinearProblem</span> @@ -579,8 +566,8 @@ window.Quarto = { </div> <p>Ok… something happened … I guess? Let’s see if we can visualize the solution.</p> </section> -<section id="visualization" class="level3"> -<h3 class="anchored" data-anchor-id="visualization">Visualization</h3> +<section id="visualization" class="level2"> +<h2 class="anchored" data-anchor-id="visualization">Visualization</h2> <p>There are different ways to visualize the solution. For a check of the solution from within our python script, we can visualize the solution using <code>pyvista</code>.</p> <p>The result is not super pretty but we can check that the solution indeed “looks” like a linear connection between the boundary conditions</p> <div id="1430c77b" class="cell" data-execution_count="11"> @@ -610,8 +597,8 @@ window.Quarto = { </div> </div> </section> -<section id="post-processing-with-paraview" class="level3"> -<h3 class="anchored" data-anchor-id="post-processing-with-paraview">Post-processing with Paraview</h3> +<section id="post-processing-with-paraview" class="level2"> +<h2 class="anchored" data-anchor-id="post-processing-with-paraview">Post-processing with Paraview</h2> <p>We can also visualize the solution using Paraview. To do that, we open the files written to the following location</p> <div id="d277e7ca" class="cell" data-execution_count="12"> <div class="sourceCode cell-code" id="cb16"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(vtk_file_abs_path_name)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> @@ -620,8 +607,8 @@ window.Quarto = { </div> </div> </section> -<section id="verification-comparing-with-the-exact-solution" class="level3"> -<h3 class="anchored" data-anchor-id="verification-comparing-with-the-exact-solution"><em>Verification</em>: Comparing with the exact solution</h3> +<section id="verification-comparing-with-the-exact-solution" class="level2"> +<h2 class="anchored" data-anchor-id="verification-comparing-with-the-exact-solution"><em>Verification</em>: Comparing with the exact solution</h2> <p>For the simple 1D Poisson equation, we can easily compare with the analytical solution, which is just a linear connection of the boundary values, e.g.</p> <p><span class="math display">\[ u_{\text{exact}}(x,y) = 1 - x \quad \text{ for } x \in [0,1], y \in [0,1] diff --git a/public/content/exercises/intro.out.ipynb b/public/content/exercises/intro.out.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..9bf0dd72857a952f24a977e5520d30e578b756f6 --- /dev/null +++ b/public/content/exercises/intro.out.ipynb @@ -0,0 +1,655 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook gives a small introduction to FenicsX, an open-source FEM\n", + "library. We use the Python API of FenicsX to solve an example PDE\n", + "problem.\n", + "\n", + "## Learning goals\n", + "\n", + "- Understand the basic structure of a FenicsX program\n", + "- Learn the basic building blocks of modern FEM software: **mesh**,\n", + " **function space**, **boundary conditions**, **weak form**, and\n", + " **solvers**\n", + "\n", + "## Poisson model\n", + "\n", + "In this example, we solve the classical Poisson equation for a scalar\n", + "$u$,\n", + "\n", + "$$ \n", + "-\\Delta u = f \\text{ in } \\Omega = \\left[0, \\,1\\right] \\times \\left[0,\\,1\\right], \\quad u = g \\text{ on } \\partial\\Omega \\quad ,\n", + "$$\n", + "\n", + "where $\\Omega$ is the domain of interest, $f$ is a given scalar source\n", + "term, and $g$ is a Dirichlet boundary condition.\n", + "\n", + "## Structure\n", + "\n", + "Below, we learn how to\n", + "\n", + "1. create a mesh for a simple domain\n", + "2. pick discrete FEM function spaces (*which functions do we use to\n", + " approximate the PDE solution?*)\n", + "3. define the weak form of the PDE\n", + "4. apply boundary conditions\n", + "5. assemble and solve the linear system resulting from the\n", + " discretization\n", + "6. visualize the solution\n", + "\n", + "## Let’s go!\n", + "\n", + "First, we import some of the necessary python libraries" + ], + "id": "1aa1393b-8647-476e-8c17-3a98e61403be" + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipykernel_3316/138077527.py:3: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", + " import tqdm.autonotebook" + ] + } + ], + "source": [ + "from mpi4py import MPI\n", + "import numpy as np\n", + "import tqdm.autonotebook\n", + "\n", + "try:\n", + " import os\n", + "\n", + " username = os.getenv(\"USER\") or os.geteuid()\n", + "\n", + " # Set XDG_RUNTIME_DIR to a valid directory\n", + " os.environ[\"XDG_RUNTIME_DIR\"] = f\"/tmp/runtime-{username}\"\n", + " os.makedirs(os.environ[\"XDG_RUNTIME_DIR\"], exist_ok=True)\n", + " os.chmod(os.environ[\"XDG_RUNTIME_DIR\"], 0o700)\n", + "except Exception as e:\n", + " print(f\"Failed to set XDG_RUNTIME_DIR: {e}\")\n", + " print(\"You might get some warnings, but it should still work.\")" + ], + "id": "67992112" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mesh and computational domain\n", + "\n", + "The basis for our discretization is a discrete approximation $\\Omega_h$\n", + "of the computational domain.\n", + "\n", + "Here, he have the choice between different discretization types,\n", + "e.g. quadrilateral, triangular etc." + ], + "id": "4fa1f062-7414-45a8-a375-d56c1970b0c2" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfinx import mesh\n", + "\n", + "number_elements = 5\n", + "domain = mesh.create_unit_square(\n", + " MPI.COMM_WORLD, number_elements, 1, cell_type=mesh.CellType.quadrilateral\n", + ")" + ], + "id": "69e562fe" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The variational problem\n", + "\n", + "A key step in building finite element methods is the weak form of the\n", + "PDE, upon which the discrete variational problem is based.\n", + "\n", + "In all cases, the weak form is obtained by multiplying the PDE with a\n", + "test function $v$ and integrating over the domain $\\Omega$.\n", + "\n", + "Further operations on the resulting integral equations, such as\n", + "integration by parts, can then be applied. This is often done improve\n", + "the properties of the method, for example to - reduce the required\n", + "regularity (*we need less derivatives of the solution to exist*) and\n", + "hence allow for lower-order (*=cheaper*) finite element spaces -\n", + "introduce symmetry to the (bi-)linear forms, which is favored by many\n", + "linear solvers - introduce certain natural boundary conditions, e.g. the\n", + "terms that appear as boundary integrals in the weak form\n", + "\n", + "A first key realization is that the weak form for a given PDE is **not**\n", + "unique.\n", + "\n", + "## A weak form for the Poisson equation\n", + "\n", + "A typical variational problem for the Poisson equation is given by\n", + "\n", + "Find $u \\in V$ such that $$\n", + "\\int_\\Omega \\nabla u_h \\cdot \\nabla v_h \\, dx - \\cancel{\\int_{\\partial\\Omega} \\mathbf{\\nabla} u_h \\cdot \\mathbf{n} \\, v_h \\, ds} = \\int_\\Omega f v_h \\, dx\n", + "$$ for all $v \\in V_{0}$. Here $\\mathbf{n}$ is the outward normal vector\n", + "on the boundary $\\partial\\Omega$ and $V_{0}$ is the space of functions\n", + "that vanish on the boundary, hence the boundary integral vanishes.\n", + "\n", + "The discrete variational problem is obtained by replacing the continous\n", + "domain $\\Omega$ with its discrete approximation $\\Omega_h$ (*our mesh*)\n", + "and the continuous trial and test spaces $V$ and $V_{0}$ with the\n", + "discrete finite element spaces $V_h$ and $V_{h,0}$, respectively.\n", + "\n", + "*Technical note:* By default, FenicsX test functions are zero on parts\n", + "of the boundary where Dirichlet conditions are applied. Since we only\n", + "use Dirichlet condiitons in this example, we don’t have to worry about\n", + "the boundary integral term and we omit the $V_{h,0}$ notation.\n", + "\n", + "## Our first finite element\n", + "\n", + "The term “finite element” refers to the basis functions defined on our\n", + "mesh. The idea of the finite element method is to find the best\n", + "approximation of the solution $u$ in a finite-dimensional function space\n", + "$V_h$.\n", + "\n", + "We thus have to pick a finite element function space $V_h$ on our mesh.\n", + "\n", + "Typically, the choice of the function space is crucial for the accuracy\n", + "and convergence of the method (*lego block analogy*)\n", + "\n", + "Let’s start with a simple linear polynomial function space on the\n", + "quadrilateral mesh that we created (*check out what it looks like\n", + "[here](https://defelement.org/elements/examples/quadrilateral-lagrange-equispaced-1.html)*)" + ], + "id": "7850d227-ee54-46db-b085-ac63f1c09645" + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# used for plotting\n", + "from dolfinx.fem import functionspace, Function, Constant, form\n", + "from basix.ufl import element\n", + "\n", + "\n", + "mesh_element_name = domain.topology.cell_name() \n", + "\"\"\" type of mesh element, e.g. \"quadrilateral\" \"\"\"\n", + "basis_functions_degree = 1\n", + "\"\"\" degree of the finite basis functions \"\"\"\n", + "\n", + "finite_element = element(\n", + " family=\"CG\", cell=domain.topology.cell_name(), degree=basis_functions_degree\n", + ")\n", + "discrete_fem_space = functionspace(mesh=domain, element=finite_element)" + ], + "id": "0c51c699" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lets have a look at our beautiful mesh:" + ], + "id": "48007d85-08d3-4ef2-b9b9-8374d124a6e3" + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "metadata": {}, + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAIAAAAxBA+LAABHs0lEQVR4Ae2ddfg1Rfn/AZHGRLE7\nsLvla4vd3YqKealY2B0Yl93dXv6wuwu7GxsbFQFJweD3loVxn3P2bMzOzM7M/fr88Tx7dmfuued1\nz+59Zva9e7Y+8cQTt+IPAhCAAAQgYJXANlY7Tr8hAAEIQAAC/yVAImQcQAACEICAaQIkQtPhp/MQ\ngAAEIEAiZAxAAAIQgIBpAiRC0+Gn8xCAAAQgQCJkDEAAAhCAgGkCJELT4afzEIAABCBAImQMQAAC\nEICAaQIkQtPhp/MQgAAEIEAiZAxAAAIQgIBpAiRC0+Gn8xCAAAQgQCJkDEAAAhCAgGkCJELT4afz\nEIAABCBAImQMQAACEICAaQIkQtPhp/MQgAAEIEAiZAxAAAIQgIBpAiRC0+Gn8xCAAAQgQCJkDEAA\nAhCAgGkCJELT4afzEIAABCBAImQMQAACEICAaQIkQtPhp/MQgAAEIEAiZAxAAAIQgIBpAiRC0+Gn\n8xCAAAQgQCJkDEAAAhCAgGkCJELT4afzEIAABCBAImQMQAACEICAaQIkQtPhp/MQgAAEIEAiZAxA\nAAIQgIBpAiRC0+Gn8xCAAAQgQCJkDEAAAhCAgGkCJELT4afzEIAABCBAImQMQAACEICAaQIkQtPh\np/MQgAAEIEAiZAxAAAIQgIBpAiRC0+Gn8xCAAAQgQCJkDEAAAhCAgGkCJELT4afzEIAABCBAImQM\nQAACEICAaQIkQtPhp/MQgAAEIEAiZAxAAAIQgIBpAiRC0+Gn8xCAAAQgQCJkDEAAAhCAgGkCJELT\n4afzEIAABCBAImQMQAACEICAaQIkQtPhp/MQgAAEIEAiZAxAAAIQgIBpAiRC0+Gn8xCAAAQgQCJk\nDEAAAhCAgGkC1SbC+9///lu3/i572csGifP+++/fsrr1mc50piBmYxj50Y9+5Fz96U9/GqOJxW2O\n6aP67jiofKfPY+x0Vgyy8w9/+IPzcHBjxx13DNJoKCPLogvVi4rtjBn/FXd/ZNeqTYQr/f/Od75z\n4IEHruyc+vHf//73y1/+8qm1KA+BfgI/+MEP+gtwFAIQiErASiIUxBe/+MUzUb7//e//7W9/O9MI\n1SGwQuD73//+yh4+QgACKQnUnwi33377Buh73/ve3/3ud3PgulTqbM6xRl0INARcInz4wx/+r6G/\no48+Gm4QgEBYAvUnwqtc5SrnOte5RE1XmDkLm9/73vc+//nPN/TvcIc7hA0D1iwTcEujl7jEJU41\n4s8yK/oOgRgE6k+E2267rYQzDbvXvOY1xx13nB/Hl7zkJU3Fy1/+8le+8pX9jFArLIHTnOY0tznl\nb9dddw1rPI21f/7znz/5yU+ati52sYulaZRWIACBNoH6E6F6e+9733uHHXbQxt/+9re3v/3t7f6P\n3FbFt73tbU3hBz/4wZL2jaxIsagEznnOc/6/U/7OdrazRW0rkvGDDjpIuVDGNagucpGLRGoFsxCA\nQA8BE4lwt912c4uZ7j5fD5T1Q5pK/uMf/9B+PS9x+9vffr1A/54TTzzxq1/96iMf+cirXe1q5znP\neZSVtVp7rWtda++991Zibq6D/RbcUdm5853vrOqS0V/4whe+7W1vq/VeyVldgf6Nv//972984xtv\ndrOb6Zqr6dRpT3tabdzgBjcQlt///vf9da0dTcPKrYue97zn3XnnnRNDDjgyR3oeo0XZlAJA5/gF\nL3hBDelddtlFo/pGN7rRW9/61ua0Xfft4IMPftKTnrTnnnue73zn06m0++67X+Yyl9lnn30++clP\njj+bnNkYnZJxOf+e97xHFxwtFZz+9KdXv3TK77XXXlqd0iM3rvWAGzMvLwE9SW1KIazy7373u1+D\n8rrXva46+K1vfcuR/dznPjepy7q5qJlHU/1xj3uc6r7yla9sPirFDpr68Ic/vMcee7jW1zfOcpaz\nPPnJTz7ssMP6TWlRV6l0m206vrtc7nKX0y3Mleo//OEPXVuadvznP/959atfreTndq5saEaixPzX\nv/51xc7Ij7qsNAYvfvGLj6wytdib3/zmpgl9D1B3VP3www9XXm/+lLcag89+9rNXurbp401ucpOm\nSmJW7Y4/+tGPbty76U1v2t6fYDvIyFxB1+92jBZ//etf/9///d+mEOub66c//em2V8cee+w973nP\nnkWdS17ykl/60pfaVfq3Y3RKLcpsI27o7JquAw984AOPOOKIdd88xr+MTL28rLdb9J6tiva+x/mV\nRKiSV73qVZshdctb3rKn4vohrb01FXW7UbpTFRiZCI866qhb3OIWneN4facmBFIPrrfu9tzlLndZ\nr+X2nPnMZz700ENdYW20r1B66tnNiV2Vzo0znvGMX//619t2Rm7/6le/chcXfe0YWWtSMc2hG5+V\n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\n27nd7W7XNLGyOqpHFZtH6bX61MjQ9Rqa5qU2zRy37ZgUQ7r0aI9kRO7ZknYBg9sXuMAFml7rxWDj\nu98eKuNrbSrZOTJXCqdvccWBGB+r7FQbVBGXl7bDobaNJkLhc1M9CfD02ysOqFY/9CrO5qNmIe5V\nKa5Az4YSpztVJIKYKSbWMxub2tLV8KUvfameNnvIQx7iVHDS/rRfirGpbpr9bnVUXjXJrGnXTQeV\n2Bwrdz/VHW0Ku3VRCXBcN9P4n20rurHa+LaiZux3ONnIdG6kb9E1HW+jyk6t48r/8rLu88w9dhOh\n3mYrVXqDz90R1Eddi5vf+tKql2ZdU/m6d1J4q5nHt6h3IUp1qVVct0Cn2e346lFL6pcX9a44NaF7\nhG6dWR9dqnO3BrVTOqCmC5/97Gfd9V2vAdKDjI2Tea6LNr75/atXeyt8+nvqU586yYK7CT1SJ+KM\npxyZTaPpW3SdjbdRZac6cWlwZnt56XR4zk67iVDU3KRQzwZJythwdElRUxa3DDUesXvrhMfTfuNb\naZe8zW1u40Q0ul84RzzWNjt/200K3eqonsvWPU5Zlniv/SMP0os3P5Kl6bjeqNk0rXu3zUqvHv3c\n9IDdfCeXsiCBvibK+tNC9yQfnJZ4ksheTaQfmelbnETSr3CVnepBke3lpcdnj0OmE6Hk+M1Ck9Yw\ntdIofPoFAPfqGfe44SSs+nnVprxeTqH3gk6qKzf0RIRUoPpz66KaUWmG2vxtuh/uTk41p5twkxqN\nV1i3VxtRj6g2onO9o6Dpgt4b4B7SaBxwE0Q3ZXzDG97QHErz+GA8Dp2Wld2b/fruMv5un96P7N5y\noBfMdlretDP4yNzUkNufvkXXdLyNyjpV7uUlbIhNJ0LpNdyamy67emzOTQe1rLfXXnt5sNYjdM30\nRVntoQ996CQLepZD8wNdGfXnnhrUb+/pEe/mr3mibt1me+aqd4quF1hkj34x1T150ty8dE8KurTn\nHHN7dL9WclkpSJuvEW3djStcwYa0Wo1KXuNEcR/ZI718qympKbV7CdHIusFH5mC76VscdGl+gco6\nVe7lZX4o2xZMJ0KB0F3A5u6UsuD++++vh2kaOlo1dTfe2rwGt6Vm1lvQmmJ6ckA/FjpYpSkg5Yv7\nQQb9wm2zVKhDEkw6C+0fR3Q7tdF+y0yah+3arfdsu+8Z+u0kPRrRvJJbiPTIxEotvbunebOUHpmQ\nvsbJZPRbMytzx5WKhX6UVlaLTo3zuk2orz6DHdEag1tk1mx7koxLxoOPzEGH07c46NL8ApV1qujL\ny/xoOgvWE6FeJ+Z0+XrlfPPUhC4x7v6WIzV+QxpI/dRLU14rnC960YsG6+rNxVKX6I6RSupVEW3N\ni9KAE/Vo2qoJxLo1ZY5mp+48ae64XmCpPZrXSmin1pUF9eymbgFqe88999R9+HWX3KRQ00e9cqwp\n4FLpevnS9+il5PpVE/VCuV8/OtH/Hh+NjX322afpsqaD7meKJ0EIOzLHNJ2+xTFezSxTU6eKvrzM\njGO7uvVEKBbr9wL12ug5sxBNJaWTbDSTzQKppjUHH3xwm7vbVurVb1koN+guoHbq+6ZmpS7zNcXc\nq8X0DLVbvHUW9Bsa7p0AepTQ7c9hQw9IOJd0g7BxySW8FQ91fWn26J0pzet+9DVFP7u6Uqyaj7vv\nvrv7kvTjH/9YP0Yv0Wxn73STVfcU3S3n5z//+XqPXWfJ/p3BR2Z/czqavsVBl+YXqKxT5V5e5ofy\nfxZ0pa7yTz9c13RSt1L6Oyj5RpO0HJRNv4bj7PT8DJMro19IaWsddUNIKUHvSZHYQe9bkfZPv4v2\nlKc8pa390wkmzY6z4DY0Y2inRr0YUDfS9HSBfnH+8Y9/vHvATqb0ohxXq+f3cVyZzg03nZUYtbPA\npJ2NTNSx1YbkPJss6Lcv2iUHf3NqTB/bP9Sg8p1Nj7HTWXE+q/322891WQNAX8L00IjkM/qGpLeQ\nS0OrV+O2XyQ0PygBR6aYjEGXvsWVYLm79VIYrRza9NG9nlSr+p1lFu9U49XgCBwc/36Xl04m5e40\n93uEnaHS4zLuYqR3QHeWae8ckwhV/ogjjmg/JOCa6NzQEqKueu1W2tvSsmqy2Fmx2alr6AEHHNCu\nMuYK1S7vtgdPLVdy5IbeD+4815uje2opr7uSuvr3pMzGyJg+Dl4IZGqMnU63g7DSz0q4bzOu+50b\n4qPvbZ2eTNoZcGSORJe+xTaQGIlQ9pftVNPBwRE4Zvx7XF7aeCvYZmn0vxcc3Yhy0oP1ldLOS9KY\nncptununv/Z8br2iJov6pXI9YLAuIXGFtTKmiYIW09ye9oYWyjRHdEuL7UM5bLdvuOr5kB6X2qum\n+kYi3WlP4WoO7b333vq5Qeny9W1mU6f0RM1nPvMZ6bB6ymyqu74/4MhcN965J32LnW6E3VlNp4q+\nvASJ6dZK5kEMYaSHgCDrBZtaC5VsUvcCm9/7ll5LUyVJdZT/Ripc9I5H6WX0Bk79zp/eMKLkrbto\n+lmGfffd1/0aS48bHMqcgL6861EKrcxLBiwVsa6zUj/p/rE0RxISB0mBKwRCjcwVsz0f07fY40yo\nQ3V0yvLlhUQY6lzADgQgAAEIFEmApdEiw4bTEIAABCAQigCJMBRJ7EAAAhCAQJEESIRFhg2nIQAB\nCEAgFAESYSiS2IEABCAAgSIJkAiLDBtOQwACEIBAKAIkwlAksQMBCEAAAkUSIBEWGTachgAEIACB\nUARIhKFIYgcCEIAABIokQCIsMmw4DQEIQAACoQiQCEORxA4EIAABCBRJgERYZNhwGgIQgAAEQhHY\nNpShKu1c5up7VtkvOgUBETjVttv++1//soZi6222OfE//7HWa/X3Owd+0WCvR3aZRDgA6vYPeshA\niboOH3XEEZ981ztvdd+Tf9a4rs5t7M1RRxz+ufe/76Z3v+fGEjUeOPLww7/ysY/sdcc719i5jX06\n8rDDvvm5z1z7VrfZWKLGA38/7G81ditYn1gaDYYSQ+US+PvfLF4mjjj0r+WGzNvzw032+qBvfdOb\nmIWKJEILUZ7Qx1/96AcTStdS9JDf/qaWrkzoxx9+9csJpWsp+puDDqqlKxP6cfSRR04oba8oidBe\nzHt7fOzRR/cer/PgsUdZ7PWhhxxSZzh7e3XoIX/qPV7nwUP/9Mc6OxaoVyTCQCBrMXPcMcfU0pUJ\n/TjuGHOJ0OY3HpvD+x/HHjvhZDBZlERoMuwbOn38P47bcKTm3Sccf3zN3dvQt+22227DkZp3b7e9\nzV5vX3NQQ/SNRBiCYi02ttt+h1q6MqEf221v8TKxrclEeKptTz1hZNRSVE+M1NKVWP0AUCyyJdq1\n+XzVv//1zxKDNdPnf51wwkwLJVa3Ofs/4fh/lBislD6TCFPSzr0tq5cJiynB5ozQ5ux/+x12zP3S\ns7R/JMKlI5BT+zvstFNO7iTyZcedd07UUjbNoJTJJhTRHUEpMwYxiXAMJRNlUMqYCPNJnUQpYyjW\nJm+BT40viXAqsWrLo5SpNrRrHbO5LopSZm0gsONkAiRChsLJBFDK2BkKKGXsxBqlzJhYkwjHUDJR\nBqWMiTCf1EmbM0KUMnZG+NSekginEqu2PEqZakO7ZcdQymzJo+ZPKGVGRpdEOBJU5cVQylQe4Fb3\nUMq0YFS+aXMS7BFUEqEHtAqroJSpMKgbumRzXRSlzIbhwO7/EiARMg7+SwCljJ1xgFLGTqxRyoyM\nNYlwJKjKi6GUqTzAre7ZnBHaXCTknTKtgd+3SSLso2PnGEoZI7FGKWMk0OomSpnxsSYRjmdVbUmU\nMtWGdq1jKGXWkFS7w+Yk2C+cJEI/blXVQilTVTh7O2NzXRSlTO+g4CBiGcYAShlLYwCljJ1oo5QZ\nH2tmhONZVVsSpUy1oV3rmM0Zoc1FQpQya8N/4w4S4UY0dg6glDESa5QyRgKtbqKUmRRrEuEkXBUW\nRilTYVA3dAmlzAYwFe62OQn2DiSJ0BtdJRVRylQSyBHdsLkuilJmxNCwXoREaH0E8E4ZOyMApYyd\nWKOUmRRrEuEkXBUWRilTYVA3dMnmjNDmIiFKmQ0nQfduEmE3Fzt7UcoYiTVKGSOBVjdRykyNNYlw\nKrGqyqOUqSqcvZ1BKdOLp6qDNifBc0JIIpxDr/i6KGWKD+HoDthcF0UpM3qAmC5IIjQdfpQydsKP\nUsZOrFHKTI01iXAqsarKo5SpKpy9nbE5I7S5SIhSpvdU6DhIIuyAYmcXShkjsUYpYyTQ6iZKGY9Y\nkwg9oFVSBaVMJYEc0Q2UMiMgVVLE5iR4ZvBIhDMBFlwdpUzBwZvous11UZQyE4eJ3eIkQruxRylj\nJ/YoZezEGqWMR6xJhB7QKqmCUqaSQI7ohs0Zoc1FQpQyI06I1SIkwlUidj6jlDESa5QyRgKtbqKU\n8Ys1idCPW/G1UMoUH8LRHUApMxpV8QVtToLnh41EOJ9hkRZQyhQZNi+nba6LopTxGixGK5EIjQYe\npYydwKOUsRNrlDJ+sSYR+nErvhZKmeJDOLoDNmeENhcJUcqMPi22KEgi3AKHnQ8oZYzEGqWMkUCr\nmyhlvGNNIvRGV3BFlDIFB2+i6yhlJgIruLjNSXCQgJEIg2AszAhKmcICNsNdm+uiKGVmDBmLVUmE\nFqOOUsZO1FHK2Ik1ShnvWJMIvdEVXBGlTMHBm+i6zRmhzUVClDITT47/FScR/o+FnS2UMkZijVLG\nSKDVTZQyc2JNIpxDr8i6KGWKDJuX0yhlvLAVWcnmJDhUqEiEoUgWYwelTDGhmu2ozXVRlDKzB445\nAyRCcyFHKWMn5Chl7MQapcycWJMI59Arsi5KmSLD5uW0zRmhzUVClDJep8jJlUiEc+gVWRelTJFh\nm+40SpnpzEqtgVJmZuRIhDMBFlYdpUxhAZvhLkqZGfAKq2pzEhwwSCTCgDALMIVSpoAgBXLR5roo\nSplAw8eWGRKhrXijlLETb5QydmKNUmZmrEmEMwEWVh2lTGEBm+GuzRmhzUVClDIzTpT/ViURzgRY\nWHWUMoUFzNddlDK+5Mqrh1JmfsxIhPMZFmMBpUwxoZrtKEqZ2QiLMWBzEhw2PCTCsDyztoZSJuvw\nBHXO5rooSpmgg8iQMRKhoWCjlLETbJQydmKNUmZ+rEmE8xkWYwGlTDGhmu2ozRmhzUVClDKzTxfE\nMvMRlmMBpUw5sZrlKUqZWfiKqoxSJki4mBEGwViAEZQyBQQpkIsoZQKBLMCMzUlw8MCQCIMjzdQg\nSplMAxPBLZvroihlIgwlKyZJhFYijVLGSqS32gqljJ1Yo5QJEmsSYRCMBRhBKVNAkAK5aHNGaHOR\nEKVMkJOGRBgEYwFGUMoUEKQQLqKUCUGxDBsoZULFiUQYimTWdlDKZB2eoM6hlAmKM2tjNifBMUJC\nIoxBNTubKGWyC0k0h2yui6KUiTagTBgmEZoIM0oZE2E+qZMoZezEGqVMqFiTCEORzNoOSpmswxPU\nOZszQpuLhChlQp06JMJQJLO2g1Im6/CEcw6lTDiWuVtCKRMwQiTCgDAzNYVSJtPARHALpUwEqJma\ntDkJjhQMEmEksBmZRSmTUTAiu2JzXRSlTORhVb95EmH9MUYpU3+MT+khSplTSNT/P0qZgDEmEQaE\nmakplDKZBiaCWzZnhDYXCVHKBDyBSIQBYWZqCqVMpoEJ7RZKmdBE87WHUiZsbEiEYXlmZw2lTHYh\nieYQSploaLMzbHMSHC8MJMJ4bLOwjFImizAkccLmuihKmSSDq/JGSISVBxilTOUBbnUPpUwLRuWb\nKGXCBphEGJZndtZQymQXkmgO2ZwR2lwkRCkT9jQiEYblmZ01lDLZhSSOQyhl4nDN0SpKmeBRIREG\nR5qRQZQyGQUjsisoZSIDzsi8zUlw1ACQCKPiXdg4SpmFA5CweZvroihlEg6xmpsiEdYcXZQyNUd3\ny76hlNmSR82fUMoEjy6JMDjSjAyilMkoGJFdsTkjtLlIiFIm+MlEIgyONCODKGUyCkZMV1DKxKSb\nl22UMjHiQSKMQTULmyhlsghDEidQyiTBnEUjNifBsdGTCGMTXsw+SpnF0Cdv2Oa6KEqZ5AOt2gZJ\nhNWGFqVMtaFd6xhKmTUk1e5AKRMjtCTCGFSzsIlSJoswJHHC5ozQ5iIhSpkYpxSJMAbVLGyilMki\nDPGdQCkTn3EuLaCUiRQJEmEksAubRSmzcAASNo9SJiHshZuyOQlOAJ1EmADyAk2glFkA+kJN2lwX\nRSmz0HCrs1kSYZ1xRSlTZ1y7eoVSpotKnftQykSKK4kwEtiFzaKUWTgACZu3OSO0uUiIUibSiUUi\njAR2YbMoZRYOQKrmUcqkIr18Oyhl4sWARBiP7WKWUcoshj55wyhlkiNfrEGbk+A0uEmEaTgnbQWl\nTFLcizZmc10Upcyig67CxkmEFQYVpUyFQd3QJZQyG8BUuBulTLygkgjjsV3MMkqZxdAnb9jmjNDm\nIiFKmXinF4kwHtvFLKOUWQx92oZRyqTlvWRrKGWi0icRRsW7gHGUMgtAX6hJlDILgV+gWZuT4GSg\nSYTJUCdqCKVMItAZNGNzXRSlTAZDrzYXSIS1RRSlTG0R3dwflDKb2dR2BKVM1IiSCKPiXcA4SpkF\noC/UpM0Zoc1FQpQyUU8yEmFUvAsYRymzAPQlmkQpswT1ZdpEKRObO4kwNuGk9lHKJMW9aGMoZRbF\nn7Rxm5PglIhJhClpR28LpUx0xNk0YHNdFKVMNgOwKkdIhFWFE6VMVeHs7QxKmV48VR1EKRM7nCTC\n2IST2kcpkxT3oo3ZnBHaXCREKRP7VCMRxiac1D5KmaS4l2sMpcxy7FO3jFImAXESYQLIiZpAKZMI\ndAbNoJTJIAiJXLA5CU4E95RmSISnkCj/f5Qy5cdwbA9srouilBk7Pig3kQCJcCKwjIujlMk4OIFd\nQykTGGjG5lDKJAgOiTAB5ERNoJRJBDqDZmzOCG0uEqKUSXDCkQgTQE7UBEqZRKCXbgalzNIRSNc+\nSpk0rEmEaThHbwWlTHTE2TSAUiabUER3xOYkODrWtQZIhGtIytyBUqbMuPl4bXNdFKWMz1ihzjgC\nJMJxnLIvhVIm+xAFcxClTDCU2RtCKZMmRCTCNJyjt4JSJjribBqwOSO0uUiIUibNaUciTMM5eiso\nZaIjzqMBlDJ5xCGFFyhlUlA+qQ0SYTLUERtCKRMRbmamUcpkFpCI7ticBEcEutk0iXAzm3KOoJQp\nJ1ZzPbW5LopSZu64oX4vARJhL55CDqKUKSRQAdxEKRMAYiEmUMokCxSJMBnqiA2hlIkINzPTNmeE\nNhcJUcokO/lIhMlQR2wIpUxEuDmZRimTUzTi+oJSJi7fLa2TCLfkUeAnlDIFBs3TZZQynuAKrGZz\nErxUoEiES5EP1i5KmWAoszdkc10UpUz2A7N4B0mExYcQpUzxIRzdAZQyo1EVXxClTMoQkghT0o7S\nFkqZKFizNGpzRmhzkRClTMpTkESYknaUtlDKRMGan1GUMvnFJJZHKGVikd1gl0S4AUwhu1HKFBKo\nAG6ilAkAsRATNifBCwaHRLgg/ABNo5QJALEQEzbXRVHKFDI8y3aTRFh2/FDKlB2/Kd6jlJlCq+yy\nKGUSx49EmBh44OZQygQGmrE5mzNCm4uEKGUSn4gkwsTAAzeHUiYw0FzNoZTJNTLh/UIpE57pkEUS\n4RChjI+jlMk4OIFdQykTGGjG5mxOgpcNCIlwWf6zWkcpMwtfUZVtrouilClqkBbsLImw4OChlCk4\neBNdRykzEVjBxVHKpA8eiTA982AtopQJhjJ7QzZnhDYXCVHKpD8dSYTpmQdrEaVMMJR5G0Ipk3d8\nQnqHUiYkzdG2SISjUWVWEKVMZgGJ6A5KmYhwMzNtcxK8eBBIhIuHwNMBlDKe4AqsZnNdFKVMgUO1\nVJdJhKVGDqVMqZGb7jdKmenMSq2BUmaRyJEIF8EeoFGUMgEgFmLC5ozQ5iIhSplFTkoS4SLYAzSK\nUiYAxBJMoJQpIUphfEQpE4bjdCskwunMMqiBUiaDICRyAaVMItAZNGNzEpwB+K1IhDlEYbIPKGUm\nIyu2gs11UZQyxQ7YIh0nERYZNpQyRYbNy2mUMl7YiqyEUmapsJEIlyI/q12UMrPwFVXZ5ozQ5iIh\nSpmlTk0S4VLkZ7WLUmYWvnIqo5QpJ1ZzPUUpM5fgjPokwhnwFqqKUmYh8As0i1JmAegLNWlzErwQ\n7NVmSYSrRPL/jFIm/xiF8tDmuihKmVDjBzsjCZAIR4LKqBhKmYyCEdkVlDKRAWdkHqXMgsEgES4I\n37NplDKe4AqsZnNGaHOREKXMgicoiXBB+J5No5TxBFdaNZQypUXM31+UMv7sQtQkEYagmNAGSpmE\nsBduCqXMwgFI2LzNSXBCwANNkQgHAOV2GKVMbhGJ54/NdVGUMvFGFJY3ESARbiKT6X6UMpkGJoJb\nKGUiQM3UJEqZZQNDIlyW/+TWUcpMRlZsBZszQpuLhChllj1NSYTL8p/cOkqZycjKrIBSpsy4+XiN\nUsaHWtA6JMKgOCMbQykTGXBG5lHKZBSMyK7YnARHhjrNPIlwGq9lS6OUWZZ/ytZtrouilEk5xmjL\nESAROhQFbKCUKSBIgVxEKRMIZAFmUMosHiQS4eIhmOAASpkJsAovanNGaHOREKXM4icriXDxEExw\nAKXMBFglF0UpU3L0pvmOUmYarzilSYRxuEawilImAtRMTaKUyTQwEdyyOQmOAHKWSRLhLHwpK6OU\nSUl72bZsrouilFl21FlunURYTPRRyhQTqtmOopSZjbAYAyhlcggViTCHKIzyAaXMKExVFLI5I7S5\nSIhSJodTlkSYQxRG+YBSZhSm8guhlCk/hmN7gFJmLKnI5UiEkQEHMo9SJhDIAsyglCkgSIFctDkJ\nDgQvpBkSYUia8WyhlInHNjfLNtdFUcrkNg5N+UMiLCPcKGXKiFMIL1HKhKBYhg2UMpnEiUSYSSAG\n3EApMwCoosM2Z4Q2FwlRymRy4pIIMwnEgBsoZQYA1XIYpUwtkRzuB0qZYUapSpAIU5Ge0Q5KmRnw\nCquKUqawgM1w1+YkeAawiFVJhBHhhjKNUiYUyfzt2FwXRSmT/8is20MSYQHxRSlTQJACuYhSJhDI\nAsyglMknSCTCfGKx0ROUMhvRVHfA5ozQ5iIhSpl8Tl8SYT6x2OgJSpmNaOo6gFKmrnj29QalTB+d\n5MdIhMmRT2wQpcxEYAUXRylTcPAmum5zEjwRUrriJMJ0rP1aQinjx63EWjbXRVHKlDhWK/OZRJh7\nQFHK5B6hcP6hlAnHMndLKGWyihCJMKtwdDiDUqYDSqW7bM4IbS4SopTJ6iQmEWYVjg5nUMp0QKlx\nF0qZGqPa3SeUMt1clttLIlyO/YiWUcqMgFRJEZQylQRyRDdsToJHgFmsCIlwMfRjGkYpM4ZSHWVs\nrouilKlj9JbeCxJh1hFEKZN1eII6h1ImKM6sjaGUyS08JMLcIrKFPyhltsBR9QebM0Kbi4QoZXI7\nlUmEuUVkC39QymyBo94PKGXqje1qz1DKrBLJ4DOJMIMgbHABpcwGMBXuRilTYVA3dMnmJHgDjFx2\nkwhzicS6Hyhl1pnUusfmuihKmVrHc3H9IhHmGzKUMvnGJrRnKGVCE83XHkqZDGNDIswwKCe7hFIm\n39iE9szmjNDmIiFKmdBnTwB7JMIAECOZQCkTCWxuZlHK5BaReP6glInHdo5lEuEcehHropSJCDcz\n0yhlMgtIRHdsToIjAg1kmkQYCGRoMyhlQhPN157NdVGUMvmOSHuekQgzjTlKmUwDE8EtlDIRoGZq\nEqVMnoEhEeYZl61QymQamAhu2ZwR2lwkRCkT4QQKYJJEGABiDBMoZWJQzdAmSpkMgxLJJZQykcDO\nN0sinM8wvAWUMuGZ5moRpUyukQnvl81JcHiOESySCCNAnW0SpcxshMUYsLkuilKmmAFqw1ESYY5x\nRimTY1Ti+IRSJg7XHK2ilMkxKif5RCLMMTQoZXKMShyfbM4IbS4SopSJcw4FsEoiDAAxuAmUMsGR\n5mkQpUyecYnhFUqZGFRD2SQRhiIZzA5KmWAoszeEUib7EAVz0OYkOBi+yIZIhJEBTzePUmY6s1Jr\n2FwXRSlT6nit128SYXaxRSmTXUiiOYRSJhra7AyjlMkuJC2HSIQtGHlsopTJIw4pvLA5I7S5SIhS\nJsUZ5dsGidCXXLR6KGWioc3LMEqZvOIR0xuUMjHpBrBNIgwAMaAJlDIBYWZuCqVM5gEK6J7NSXBA\ngLFNkQhjE55mH6XMNF4ll7a5LopSpuQxW63vJMK8QotSJq94xPQGpUxMunnZRimTVzzWvCERriFZ\ndAdKmUXxJ23c5ozQ5iIhSpmkp9b0xkiE05nFrIFSJibdjGyjlMkoGJFdQSkTGXAA8yTCABBDmUAp\nE4pk/nZQyuQfo1Ae2pwEh6KXxg6JMA3nUa2glBmFqYpCNtdFUcpUMXgr7ASJMKOgopTJKBiRXUEp\nExlwRuZRymQUjA2ukAg3gFliN0qZJagv06bNGaHNRUKUMsucY1NaJRFOoRW5LEqZyIBzMY9SJpdI\nxPcDpUx8xgFaIBEGgBjEBEqZIBiLMIJSpogwBXHS5iQ4CLqURkiEKWn3tYVSpo9OXcdsrouilKlr\nFFfVGxJhLuFEKZNLJOL7gVImPuNcWkApk0skev0gEfbiSXgQpUxC2As3ZXNGaHOREKXMwifbuOZJ\nhOM4xS+FUiY+4yxaQCmTRRiSOIFSJgnmAI2QCANAnG8Cpcx8hqVYQClTSqTm+2lzEjyfW3oLJML0\nzDtaRCnTAaXSXTbXRVHKVDqcK+kWiTCLQKKUySIMSZxAKZMEcxaNoJTJIgwjnCARjoAUvwhKmfiM\nc2nB5ozQ5iIhSplczrohP0iEQ4SSHEcpkwTz8o2glFk+Bqk8QCmTinSAdkiEASDONIFSZibAgqqj\nlCkoWDNdtTkJngltqeokwqXI/69dlDL/Y1H7ls11UZQytY/r4vtHIlw+hChllo9BKg9QyqQivXw7\nKGWWj8FoD0iEo1FFK4hSJhra7AzbnBHaXCREKZPd6bfZIRLhZjapjqCUSUV64XZQyiwcgITNo5RJ\nCDtAUyTCABDnmEApM4deWXVRypQVrzne2pwEzyG2bF0S4bL8t0Ips3AAEjZvc10UpUzCIUZTngRI\nhJ7gQlVDKROKZP52UMrkH6NQHqKUCUUyjR0SYRrOG1tBKbMRTXUHbM4IbS4SopQp6/QlES4cL5Qy\nCwcgVfMoZVKRXr4dlDLLx2CiByTCicCCFkcpExRn1sZQymQdnqDO2ZwEB0WY2hiJMDXxdnsoZdo0\n6t62uS6KUqbuUV1N70iES4YSpcyS9NO2jVImLe8lW0MpsyR9r7ZJhF7YAlVCKRMIZAFmbM4IbS4S\nopQp4ITc0kUS4ZY80n5CKZOW92KtoZRZDH3yhlHKJEceoEESYQCIfiZQyvhxK7EWSpkSo+bns81J\nsB+rfGqRCBeLBUqZxdAnb9jmuihKmeQDjQY9CZAIPcHNr4ZSZj7DUiyglCklUvP9RCkzn2F6CyTC\n9MxPbhGlzGLokzdsc0Zoc5EQpUzy0ytAgyTCABD9TKCU8eNWXC2UMsWFzNthlDLe6JatSCJchj9K\nmWW4L9EqSpklqC/Tps1J8DKsg7ZKIgyKc7QxlDKjURVf0Oa6KEqZ4geupQ6QCJeJNkqZZbgv0SpK\nmSWoL9MmSplluM9ulUQ4G6GXAZQyXtiKrGRzRmhzkRClTJGn6FZbkQiXCRxKmWW4J28VpUxy5Is1\niFJmMfSzGyYRzkY43QBKmenMSq2BUqbUyE332+YkeDqnHGuQCBeICkqZBaAv1KTNdVGUMgsNN5r1\nJEAi9AQ3pxpKmTn0yqqLUqaseM3xFqXMHHrL1iURLsAfpcwC0Bdq0uaM0OYiIUqZhU6yAM2SCANA\nnGoCpcxUYoWWRylTaOA83EYp4wEtnyokwtSxQCmTmvhy7aGUWY596pZtToJTU47WHokwGtoNhlHK\nbABT4W6b66IoZSocyrV3iUSYOsIoZVITX649lDLLsU/dMkqZ1MSDtkciDIpzhDGUMiMgVVLE5ozQ\n5iIhSpmiT1oSYerwoZRJTXyh9lDKLAR+gWZRyiwAPWiTJMKgOIeMoZQZIlTPcZQy9cRyqCc2J8FD\nVEo6TiJMGi2UMklxL9qYzXVRlDKLDjoa9yRAIvQE51cNpYwftxJroZQpMWp+PqOU8eOWTy0SYdJY\noJRJinvRxmzOCG0uEqKUWfRUC9A4iTAAxPEmUMqMZ1V0SZQyRYdvkvMoZSbhyrMwiTBdXFDKpGO9\ndEsoZZaOQLr2bU6C0/FN0hKJMAnmkxpBKZOO9dIt2VwXRSmz9LijfU8CJEJPcB7VUMp4QCu0CkqZ\nQgPn4TZKGQ9ouVUhEaaLCEqZdKyXbsnmjNDmIiFKmaXPtgDtkwgDQBxpAqXMSFClF0MpU3oEx/uP\nUmY8q5xLkggTRQelTCLQGTSDUiaDICRyweYkOBHchM2QCBPBRimTCHQGzdhcF0Upk8HQwwVPAiRC\nT3BTq6GUmUqs3PIoZcqN3VTPUcpMJZZneRJhoriglEkEOoNmbM4IbS4SopTJ4IQL4AKJMADEMSZQ\nyoyhVEEZlDIVBHFkF1DKjASVfzESYYoYoZRJQTmPNlDK5BGHFF7YnASnIJu8DRJhCuQoZVJQzqMN\nm+uiKGXyGH144UmAROgJblI1lDKTcBVdGKVM0eGb5DxKmUm4ci5MIkwRHZQyKSjn0YbNGaHNRUKU\nMnmccwG8IBEGgDhoAqXMIKI6CqCUqSOOY3qBUmYMpVLKkAijRwqlTHTE2TSAUiabUER3xOYkODrW\nhRogEUYHj1ImOuJsGrC5LopSJpsBiCOeBEiEnuDGV0MpM55V6SVRypQewfH+o5QZzyr/kiTC6DFC\nKRMdcTYN2JwR2lwkRCmTzWkXwBESYQCI/SZQyvTzqeYoSplqQjnYEZQyg4jKKkAijBsvlDJx+eZk\nHaVMTtGI64vNSXBcpotaJxHGxY9SJi7fnKzbXBdFKZPTGMQXTwIkQk9wI6uhlBkJqoJiKGUqCOLI\nLqCUGQmqlGIkwriRQikTl29O1m3OCG0uEqKUyenMC+ALiTAAxB4TKGV64NR0CKVMTdHs7wtKmX4+\nJR4lEUaMGkqZiHAzM41SJrOARHTH5iQ4ItAMTJMIIwYBpUxEuJmZtrkuilIms2GIO54ESISe4MZU\nQykzhlIdZVDK1BHHMb1AKTOGUlllSIQR44VSJiLczEzbnBHaXCREKZPZyRfAHRJhAIibTKCU2USm\nsv0oZSoLaE93UMr0wCn3EIkwVuxQysQim59dlDL5xSSWRzYnwbFoZmOXRBgrFChlYpHNz67NdVGU\nMvmNRDzyJEAi9AQ3WA2lzCCiagqglKkmlIMdQSkziKjEAiTCWFFDKROLbH52bc4IbS4SopTJ7/wL\n4BGJMADEThMoZTqx1LcTpUx9Md3UI5Qym8iUvp9EGCWCKGWiYM3SKEqZLMMSxSmbk+AoKDMzSiKM\nEhCUMlGwZmnU5rooSpksByNOeRIgEXqC66+GUqafT01HUcrUFM3+vqCU6edT7lESYZTYoZSJgjVL\nozZnhDYXCVHKZHkKBnCKRBgA4roJlDLrTKrcg1KmyrB2dgqlTCeWOnaSCMPHEaVMeKa5WkQpk2tk\nwvtlcxIcnmOWFkmE4cOCUiY801wt2lwXRSmT63jEL08CJEJPcD3VUMr0wKnsEEqZygLa0x2UMj1w\nSj9EIgwfQZQy4ZnmatHmjNDmIiFKmVzPwgB+kQgDQFwxgVJmBUitH1HK1BrZ9X6hlFlnUtMeEmHg\naKKUCQw0Y3MoZTIOTmDXbE6CA0PM2ByJMHBwUMoEBpqxOZvroihlMh6SuOZJgEToCW5TNZQym8jU\ntx+lTH0x3dQjlDKbyNSxn0QYOI4oZQIDzdiczRmhzUVClDIZn4gBXCMRBoDYNoFSpk2j4m2UMhUH\nd6VrKGVWgNT3kUQYMqYoZULSzNsWSpm84xPSO5uT4JAEs7dFIgwZIpQyIWnmbcvmuihKmbxHJd55\nEiAReoLrrIZSphNLlTtRylQZ1s5OoZTpxFLTThJhyGiilAlJM29bNmeENhcJUcrkfS4G8I5EGACi\nM4FSxqGoewOlTN3xbfcOpUybRq3bJMJgkUUpEwxl9oZQymQfomAO2pwEB8NXiCESYbBAoZQJhjJ7\nQzbXRVHKZD8wcdCTAInQE9x6NZQy60xq3YNSptbIrvcLpcw6k/r2kAiDxRSlTDCU2RuyOSO0uUiI\nUib70zGAgyTCABAbEyhlgqHM2xBKmbzjE9I7lDIhaWZsi0QYJjgoZcJwLMEKSpkSohTGR5uT4DDs\nirJCIgwTLpQyYTiWYMXmuihKmRLGJj56EiAReoJbqYZSZgVIxR9RylQc3JWuoZRZAVLrRxJhmMii\nlAnDsQQrNmeENhcJUcqUcEYG8JFEGACiTKCUCcMxeysoZbIPUTAHUcoEQ5m9IRJhgBChlAkAsRAT\nKGUKCVQAN21OggOAK9AEiTBA0FDKBIBYiAmb66IoZQoZnrjpSYBE6AmuXQ2lTJtG3dsoZeqOb7t3\nKGXaNOreJhEGiC9KmQAQCzFhc0Zoc5EQpUwhJ2UAN0mEASCilAkAsQQTKGVKiFIYH1HKhOFYiBUS\n4dxAoZSZS7Cc+ihlyonVXE9tToLnUiu2PolwbuhQyswlWE59m+uiKGXKGaF46kmAROgJzlVDKeNQ\nVL+BUqb6ELsOopRxKCxskAjnRhmlzFyC5dS3OSO0uUiIUqac8zKApyTCuRBRyswlWEh9lDKFBCqA\nmyhlAkAsygSJcFa4UMrMwldUZZQyRYVrlrM2J8GzkBVemUQ4K4AoZWbhK6qyzXVRlDJFDVKc9SRA\nIvQE11RDKTMLX1GVUcoUFa5ZzqKUmYWvwMokwllBQykzC19RlW3OCG0uEqKUKerUDOAsiXAWRJQy\ns/CVUxmlTDmxmuspSpm5BAusTyL0DxpKGX92pdVEKVNaxPz9tTkJ9udVRU0SoX8YUcr4syutps11\nUZQypY1T/PUkQCL0BKdqKGX82ZVWE6VMaRHz9xeljD+7YmuSCP1Dh1LGn11pNW3OCG0uEqKUKe3s\nDOAvidAfIkoZf3ZF1UQpU1S4ZjmLUmYWvmIrkwg9Q4dSxhNcgdVQyhQYNE+XbU6CPWFVVI1E6BlM\nlDKe4AqsZnNdFKVMgUMVlz0JkAg9waGU8QRXYDWUMgUGzdNllDKe4AqvRiL0DCBKGU9wBVazOSO0\nuUiIUqbAEzSAyyRCT4goZTzBlVYNpUxpEfP3F6WMP7vCa5IIfQKIUsaHWpl1UMqUGTcfr21Ogn1I\nVVeHROgTUpQyPtTKrGNzXRSlTJmjFa89CZAIfcChlPGhVmYdlDJlxs3Ha5QyPtSqqEMi9AkjShkf\namXWsTkjtLlIiFKmzHM0gNckQh+IKGV8qBVYB6VMgUHzdBmljCe4KqqRCCeHEaXMZGTFVkApU2zo\nJjtucxI8GVOlFUiEkwOLUmYysmIr2FwXRSlT7IDFcU8CJMLJ4FDKTEZWbAWUMsWGbrLjKGUmI6uo\nAolwcjBRykxGVmwFmzNCm4uEKGWKPU0DOE4inAwRpcxkZGVWQClTZtx8vEYp40OtojokwmnBRCkz\njVfJpVHKlBy9ab7bnARPY1R1aRLhtPCilJnGq+TSNtdFUcqUPGbx3ZMAiXAaOJQy03iVXBqlTMnR\nm+Y7SplpvKorTSKcFlKUMtN4lVza5ozQ5iIhSpmSz9QAvpMIp0FEKTONV7GlUcoUG7rJjqOUmYys\nugokwgkhRSkzAVbhRVHKFB7ACe7bnARPAGSgKIlwQpBRykyAVXhRm+uiKGUKH7a470mARDgBHEqZ\nCbAKL4pSpvAATnAfpcwEWJUWJRFOCCxKmQmwCi9qc0Zoc5EQpUzhJ2sA90mEEyCilJkAq+SiKGVK\njt4031HKTONVaWkS4djAopQZS6r8cihlyo/h2B7YnASPpWOmHIlwbKhRyowlVX45m+uiKGXKH7n0\nwJMAiXAsOJQyY0mVXw6lTPkxHNsDlDJjSVVdjkQ4NrwoZcaSKr+czRmhzUVClDLln68BekAiHAsR\npcxYUoWXQylTeAAnuI9SZgKsqouSCEeFF6XMKExVFEIpU0UYR3XC5iR4FBpjhUiEowKOUmYUpioK\n2VwXRSlTxeClE54ESISjwKGUGYWpikIoZaoI46hOoJQZhclAIRLhqCCjlBmFqYpCNmeENhcJUcpU\nccoG6ASJcBRElDKjMJVfCKVM+TEc2wOUMmNJGShHIhwOMkqZYUa1lEApU0skh/thcxI8zMVkCRLh\ncNhRygwzqqWEzXVRlDK1jF/64UmARDgMDqXMMKNaSqCUqSWSw/1AKTPMyEwJEuFwqFHKDDOqpYTN\nGaHNRUKUMrWctQH6QSIchohSZphRFSVQylQRxlGdQCkzCpOZQiTCgVCjlBkAVNFhlDIVBXOgKzYn\nwQNQDB8mEQ4EH6XMAKCKDttcF0UpU9EQpiueBEiEA+BQygwAqugwSpmKgjnQFZQyA4CMHSYRDgQc\npcwAoIoO25wR2lwkRClT0YkboCskwgGIKGUGANVyeMedd66lKxP6sePOu0woXUtRm7GuJXpR+kEi\n7MO621nP1ne40mO7neWslfasr1s777pr3+FKj+20q8VEuNMuFntd6RAO0y0SYR/HXU5zmr7DlR47\n9x57VNqzvm6d/Xzn7ztc6bGznOvclfasr1vnu9gl+g5zzB4BEmFfzPe43OX7Dld67PS7nanSnvV1\n63Qme33aM56xDwrHIGCDwNYnnniijZ769PIyV9/Tp1rhdbbeZhubWtnC44b7EOgj8J0Dv9h32PYx\nEqHt+NN7CEAAAuYJsDRqfggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0E\nIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERo\nfggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI\n2CZAIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn\n9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwB\nEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAA\nBCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAht\nx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB\n8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERofggA\nAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZA\nIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCA\nAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5\nIQAACEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBg\nmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/e\nQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRI\nhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQ\ngIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQd\nf3oPAQhAwDwBEqH5IQAACEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCAAATM\nEyARmh8CAIAABCBgmwCJ0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDwBEqH5IQAA\nCEAAArYJkAhtx5/eQwACEDBPgERofggAAAIQgIBtAiRC2/Gn9xCAAATMEyARmh8CAIAABCBgmwCJ\n0Hb86T0EIAAB8wRIhOaHAAAgAAEI2CZAIrQdf3oPAQhAwDyB/w+xAIruhMIRrQAAAABJRU5ErkJg\ngg==\n" + } + } + ], + "source": [ + "try:\n", + " shell = get_ipython().__class__.__name__\n", + " has_visualization = True \n", + "except NameError:\n", + " has_visualization = False\n", + "\n", + "if has_visualization:\n", + " import pyvista\n", + " import dolfinx\n", + "\n", + " # Set the default window size globally\n", + " pyvista.global_theme.window_size = (600, 600) # Adjust width and height as needed\n", + "\n", + " pyvista.set_jupyter_backend(\"static\")\n", + " pyvista.start_xvfb()\n", + "\n", + " # Extract topology from mesh and create pyvista mesh\n", + " topology, cell_types, x = dolfinx.plot.vtk_mesh(discrete_fem_space)\n", + " grid = pyvista.UnstructuredGrid(topology, cell_types, x)\n", + "\n", + " plotter = pyvista.Plotter()\n", + " plotter.add_title(f\"Mesh with {number_elements} elements\")\n", + " plotter.add_mesh(grid, show_edges=True)\n", + " plotter.camera_position = \"xy\"\n", + "\n", + " if not pyvista.OFF_SCREEN:\n", + " plotter.show()\n", + " else:\n", + " plotter.screenshot(\"mesh.png\")" + ], + "id": "ef716852" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## *From Math to Code:* the weak form and UFL\n", + "\n", + "The main advantage of software like FenicsX is that it provides a way to\n", + "work in a syntax that is very close to the mathematical notation of the\n", + "weak form. The underlying syntax is called **UFL** (Unified Form\n", + "Language) and is a domain-specific language for finite element\n", + "variational forms.\n", + "\n", + "Let’s see how we can write the weak form in UFL." + ], + "id": "dfb0bd73-8f53-4f20-b653-598f12b580e3" + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from ufl import TestFunction, TrialFunction, dot, ds, dx, grad\n", + "\n", + "V_h = discrete_fem_space\n", + "\"\"\" Discrete finite element space \"\"\"\n", + "\n", + "u_h = TrialFunction(V_h)\n", + "\"\"\" discrete trial function \"\"\"\n", + "v_h = TestFunction(V_h)\n", + "\"\"\" discrete test function \"\"\"\n", + "\n", + "f = Constant(domain, 0.0)\n", + "\"\"\" right-hand side source term \"\"\"\n", + "\n", + "# Define the weak form lhs == rhs\n", + "weak_form_lhs = dot(grad(u_h), grad(v_h)) * dx\n", + "weak_form_rhs = f * v_h * dx" + ], + "id": "5804d191" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Boundary conditions\n", + "\n", + "There are a couple of ways to apply boundary conditions in FenicsX. We\n", + "cover the simplest way to set Dirichlet boundary conditions.\n", + "\n", + "The basic idea is to tell FenicsX where we want to apply the Dirichlet\n", + "boundary condition in terms of the mesh and then let the software figure\n", + "out which nodes and facets of the mesh coincide with that geometrical\n", + "location.\n", + "\n", + "We therefore start by defining functions to tell FenicsX what we\n", + "consider to be the left and right boundary of the domain ($x=0$ and\n", + "$x=1$)." + ], + "id": "76d330b2-d822-4794-8f62-572a134f0255" + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# return 1 on the left boundary of the unit square, e.g when x = (x,y)[0] close to 0\n", + "def left_boundary_marker(x):\n", + " return np.isclose(x[0], 0.0)\n", + "\n", + "\n", + "# return 1 on the right boundary of the unit square, e.g when x = (x,y)[0] close to 1\n", + "def right_boundary_marker(x):\n", + " return np.isclose(x[0], 1.0)" + ], + "id": "e68f61c8" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now create two boundary conditions for a constant value of $g=1$ on\n", + "the left boundary and $g=0$ on the right boundary." + ], + "id": "72e6d76a-bb73-4728-b1df-e6662d04fdda" + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "metadata": {}, + "data": { + "text/plain": [ + "' list of Dirichlet boundary conditions '" + ] + } + } + ], + "source": [ + "from dolfinx.fem import dirichletbc, locate_dofs_topological\n", + "from dolfinx.mesh import locate_entities_boundary\n", + "\n", + "mesh_topology_dim = domain.topology.dim\n", + "facet_geometrical_dimension = mesh_topology_dim - 1\n", + "\n", + "facets_on_left_boundary = locate_entities_boundary(\n", + " domain, facet_geometrical_dimension, left_boundary_marker\n", + ")\n", + "dofs_on_left_boundary = locate_dofs_topological(\n", + " V_h, facet_geometrical_dimension, facets_on_left_boundary\n", + ")\n", + "\n", + "value_left = Constant(domain, 1.0)\n", + "\"\"\" value on the left boundary \"\"\"\n", + "bc_left = dirichletbc(value_left, dofs_on_left_boundary, V_h)\n", + "\n", + "facets_on_right_boundary = locate_entities_boundary(\n", + " domain, facet_geometrical_dimension, right_boundary_marker\n", + ")\n", + "dofs_on_right_boundary = locate_dofs_topological(\n", + " V_h, facet_geometrical_dimension, facets_on_right_boundary\n", + ")\n", + "value_right = Constant(domain, 0.0)\n", + "\"\"\" value on the right boundary \"\"\"\n", + "bc_right = dirichletbc(value_right, dofs_on_right_boundary, V_h)\n", + "\n", + "dirichlet_boundary_conditions = [bc_left, bc_right]\n", + "\"\"\" list of Dirichlet boundary conditions \"\"\"" + ], + "id": "e0266dc5" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assemble and solve the linear system\n", + "\n", + "We start by creating a discrete function to store our solution vector.\n", + "The function lives in the same approximation space as our trial function\n", + "$u_h$ and is initialized to zero:" + ], + "id": "b136c93d-ab21-4bd8-a20d-34ecb753dc2a" + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "metadata": {}, + "data": { + "text/plain": [ + "' discrete solution, a function in the finite element space. Our solution vector will be stored here '" + ] + } + } + ], + "source": [ + "discrete_solution = Function(V_h)\n", + "\"\"\" discrete solution, a function in the finite element space. Our solution vector will be stored here \"\"\"" + ], + "id": "fb6042bc" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, we create a writer for the VTK file to store our results on disk." + ], + "id": "bccfe642-5b08-47ba-b465-af7e9be3f8ee" + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Writing solution to file /root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "from dolfinx.io import VTXWriter\n", + "\n", + "from pathlib import Path\n", + "\n", + "out_folder_path = Path(\"out_tutorial\")\n", + "out_folder_path.mkdir(exist_ok=True, parents=True)\n", + "vtx_writer = VTXWriter(\n", + " domain.comm, out_folder_path / \"poisson_solution.bp\", discrete_solution, engine=\"BP4\"\n", + ")\n", + "vtx_writer.write(t=0.0)\n", + "\n", + "vtk_file_abs_path_name = str(out_folder_path.resolve()) + \"/poisson_solution.bp\"\n", + "print(\"Writing solution to file \" + vtk_file_abs_path_name)" + ], + "id": "529bcf95" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## This is where the magic happens\n", + "\n", + "We now reap the true benefit of modern FEM backends: we can assemble the\n", + "linear system and solve it in a single line of code." + ], + "id": "dc1ca89c-d87a-4b70-a4a4-c72ebc49a966" + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfinx.fem.petsc import LinearProblem\n", + "\n", + "linear_solver_options = {\"ksp_type\": \"preonly\", \"pc_type\": \"lu\"}\n", + "\n", + "problem = LinearProblem(\n", + " weak_form_lhs,\n", + " weak_form_rhs,\n", + " bcs=dirichlet_boundary_conditions,\n", + " petsc_options= linear_solver_options,\n", + ")\n", + "\n", + "\n", + "discrete_solution = problem.solve()\n", + "\n", + "# Write the solution to disk\n", + "vtx_writer.write(t=1.0)" + ], + "id": "06034319" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ok… something happened … I guess? Let’s see if we can visualize the\n", + "solution.\n", + "\n", + "## Visualization\n", + "\n", + "There are different ways to visualize the solution. For a check of the\n", + "solution from within our python script, we can visualize the solution\n", + "using `pyvista`.\n", + "\n", + "The result is not super pretty but we can check that the solution indeed\n", + "“looks” like a linear connection between the boundary conditions" + ], + "id": "79f411d4-941b-46e3-abfb-e0d98827510f" + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "output_type": "display_data", + "metadata": {}, + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAIAAAAxBA+LAABuhElEQVR4Ae1dB7xcRfV++96+lrwE\nCL2mAaEnSBelF+lCwKCgUhQ0dCzInyogRVARUKQTg0gRpCNdSugICQQINZACJJAAaa+//7c7u5P7\ntty9/d6551v45c2dO+Wc78zeszP3mzOZvr6+On6IABEgAkSACEhFoF6q4tSbCBABIkAEiEAOATpC\njgMiQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASI\nABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASIABEQjQAd\noWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASIABEQjQAdoWjzU3ki\nQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASIABEQjQAdoWjzU3kiQASIABGg\nI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJE\ngAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI\n0BGKNj+VJwJEgAgQATpCjgEiQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+V\nJwJEgAgQATpCjgEiQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQ\nATpCjgEiQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEi\nQASIABEQjQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+VJwJEgAgQATpCjgEiQASIABEQ\njQAdoWjzU3kiQASIABGgI+QYIAJEgAgQAdEI0BGKNj+Vt0dg6tSpmeJn2rRp9oWDuouOin1mIEDF\nZmMRrKIkzCQCKUCAjjAFRqQKRIAIEAEi4B0BOkLv2LEmESACRIAIpAABOsIUGJEqEAEiQASIgHcE\n6Ai9Y8eaRIAIEAEikAIEsinQgSoQAWkIDB48+MADD1RaDxo0SJr61JcIBIsAHWGweLI1IhAFAmuu\nuebtt98eRU/sgwgIQICOUICRjVXx+eefv/zyy59++um5c+eutdZam2yyyY477nj00Uc3NDQ40am3\nt/e555675557nnnmmU/ynwEDBqyyyirDhw/fY4899tlnH7TppJ0UlAkJivb29gceeODWW2994403\nZs+e3dXVtfrqqw8bNmzvvfc+4IADkE4BdFRBBAJ9/BCB5CGwZMmSX/3qV/X1Fd5hb7bZZpMnT64p\nMiZMa6+9tv13+KCDDnrvvfdsmsLzXbfw9ttvW0va3LIWK0+PGTNGtXn66aeruxdeeKHuxT4BB6Oq\nzJ8//8bi56uvvirvxZoTEhT333+/zS8J2O6YY4758ssvrZIwTQSSiUBdMsWiVMIROPTQQ21cwkor\nrfT5559XgwjTxx122MGmuvVWY2Pjn/70p2pN2Xg7m1vVWlP5gThCh72HBMVbb711yimnWGGsll51\n1VVff/11e0B4lwjEjkCFX9zVxjTziUA0CPznP/+56aabVF+jRo268847P/rooxdeeOGoo45SmXPm\nzDn22GMrCoN525Zbbvnf//5X3c1ms/vuu+8NN9zw8ssvY+0O878nnnjitNNOGzlypCqA1byTTjoJ\ncxd8FSs2aG5meFBgLnvRRRcpZLBYfd11173yyitYe0aP995775FHHtnW1qbuInOnnXaqFh/HXGwp\nedoQiN0VUwAiUILAhhtuqL5mI0aMWLBggfUunJb+Bn788cfWW0hjmjh06FBdYOedd37zzTdLyqjL\n7u7uyy67zMq3POecc8pL2ky8bG6Vt2PNKZ8R4gUe5NEfa8uvvfaazkeip6dHNWUtU7JmqwqECoVC\nGLM9vCC0qqbTM2bM2HPPPbUhRo8eDeH1XSaIQNIQ4NJo0iwiXR48Q/UDdOLEiSVwfPHFF4jDqQpg\npmi9C3cCz6frYsqo3Ya1mDX96quvrrzyyqoK3mk9+uij1rtI2/gbm1sljZRcljvCkgJwbFoL9FJy\nV13a9x42FBBvyJAhiIlaUTaVCc+HV7BakWuuucamMG8RgXgR4NKo/qoykQgEPvzwQy3HVlttpdMq\ngefvtttuu0b+g3VO693bbrvtscceUzk/+tGPQDetyLWxVoFPwjJsU1MTMuE8MN3Et9FawNB0BFBc\nccUV6667rg0+YPZef/31q622miqDtE1h3iIC8SJARxgv/uy9FAE94cMNTOlKb9fVYTcFZo34gFaq\n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\nJZ/+wf36X6Hx4kenionC3+KlKqev8rYt1sVffUMniznFv4XCVSvmy1kL90v3u7D0q7sr5i1t31pF\nFytm4u/0j14fNnTjQkbuj+Webk0nijdVxtKrpancndxVPqd/dr5SIb9wR//RiXyhwj+FzKX1LM1a\n7xWFXqp1UQtVKvdvPrW0Uv9LXC29le+u13Kdu5u/VHm93Qvvv/PaXXfdtSAl//RHwBhHOGXKlNGj\nR/cX3u4Ks8M33nhj1KhRdoWq3/voo4+GDRv28MMPVy/CO6UI/O9//0NWUId+lLae0muC5sGwAI3D\nzC1uu+22m0HTHrfa+SxvjCPEoUtfffUVtF1rrbUuuOACxOBubS1dwcOOqFdfffXEE0/8+uuvUfJb\n3/rW008/7RMgVicCRIAIpAAB/LgfOnRoChQJQwVjHKFafltmmWWmT59echJhCS7z589X507g3y++\n+KLkLi+JABEgAkSACFgRMIwss+6669p7QeiGg+mV11QzSKu2TBMBIkAEiAARKEHAMEe4ePHiEgVs\nLk0MmWGjDm8RASJABIhAGAgY5ginTp366KOP2gCBt8H/+Mc/1DvhlVe20hdtKvEWESACRIAIyEXA\nmA31IIkpfh0YwDvvvPOee+65wgr9tkDB+WGX4e233/7mm28qe373u9+Va1hqTgSIABEgAs4QMIYs\ns2TJEjBlurq6nOlVt/rqq8+YMUPvcHNYi8WIABEgAkRAGgLGLI1iswT2BY4YMcKJhcaMGfPWW2/R\nCzrBimWIABEgAsIRMGZGqOzU3d393HPP/fe//33//ffLiTMDBw7E/sIddthhq622Em5Xqk8EiAAR\nIAIOETDMETrUisWIABEgAkSACDhEwJilUYf6sBgRIAJEgAgQAVcIpMERvvzyy3gdiM9NN93kSnld\nGIc6XX311dtttx024w8YMABH+/7mN7+ZO3euLmCTmDdv3qmnnrrBBhugIqqjETTFmH42iPEWESAC\nRCBZCOCRbfrnpZdeUphOnDjRgy5ffvnlJptsUm4VkFTxPtK+QYQ2xYvJ8ro4HBivMO3rmnUXvxXO\nP/98nHtlVRZvZLGnpaYiCHRXspVl0KBB3oxVs69EFZg8efI666xjRayhoeGwww4D+dleztdff91a\nS6ePPvpo+4qm30W44BNOOAEoaZWR2HzzzadNm1ZTNQzRX/3qVziUVNfdeOONsaWqZsUUFMBXzPoB\n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\nC+/Q5H9fIJsAAAAASUVORK5CYII=\n" + } + } + ], + "source": [ + "if has_visualization:\n", + " cells, types, x = dolfinx.plot.vtk_mesh(V_h)\n", + " grid = pyvista.UnstructuredGrid(cells, types, x)\n", + " plotter = pyvista.Plotter()\n", + "\n", + " plotter.add_mesh(grid, scalars=discrete_solution.x.array, show_edges=True, cmap=\"coolwarm\")\n", + " plotter.add_title(f\"solution\")\n", + "\n", + " # add axes labels for x and y axes\n", + " plotter.show_bounds(\n", + " grid=None,\n", + " location=\"outer\",\n", + " all_edges=True,\n", + " )\n", + "\n", + " plotter.view_xy()\n", + " plotter.show()" + ], + "id": "1430c77b" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Post-processing with Paraview\n", + "\n", + "We can also visualize the solution using Paraview. To do that, we open\n", + "the files written to the following location" + ], + "id": "b174df2a-2d5a-436b-a584-f3e0d18363cd" + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp" + ] + } + ], + "source": [ + "print(vtk_file_abs_path_name)" + ], + "id": "d277e7ca" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## *Verification*: Comparing with the exact solution\n", + "\n", + "For the simple 1D Poisson equation, we can easily compare with the\n", + "analytical solution, which is just a linear connection of the boundary\n", + "values, e.g.\n", + "\n", + "$$\n", + "u_{\\text{exact}}(x,y) = 1 - x \\quad \\text{ for } x \\in [0,1], y \\in [0,1]\n", + "$$" + ], + "id": "e564809d-861c-465e-abdf-754c8f7c22f2" + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "L2 error with respect to the analytical solution: 1.2378947445213391e-16\n", + "Maximum error at the degrees of freedom: 3.3306690738754696e-16" + ] + } + ], + "source": [ + "from dolfinx.fem import assemble_scalar, form\n", + "from petsc4py import PETSc\n", + "\n", + "def u_exact(x):\n", + " values = np.zeros((1 , x.shape[1]), dtype=PETSc.ScalarType)\n", + " values[0] = 1.0 - x[0]\n", + " return values\n", + "\n", + "u_ex = Function(V_h)\n", + "u_ex.interpolate(u_exact)\n", + "\n", + "L2_error = form(dot(discrete_solution - u_ex, discrete_solution - u_ex) * dx)\n", + "\n", + "error_L2 = np.sqrt(domain.comm.allreduce(assemble_scalar(L2_error), op=MPI.SUM))\n", + "error_max = domain.comm.allreduce(\n", + " np.max(discrete_solution.x.petsc_vec.array - u_ex.x.petsc_vec.array), op=MPI.MAX\n", + ")\n", + "\n", + "print(\"L2 error with respect to the analytical solution: \" + str(error_L2))\n", + "print(\"Maximum error at the degrees of freedom: \" + str(error_max))" + ], + "id": "1ae66bfb" + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "custom_cell_magics": "kql" + }, + "kernelspec": { + "name": "python3", + "display_name": "dolfinx-env", + "language": "python" + }, + "language_info": { + "name": "python", + "codemirror_mode": { + "name": "ipython", + "version": "3" + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + } +} \ No newline at end of file diff --git a/public/content/exercises/intro.pdf b/public/content/exercises/intro.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f943548da78c56e9e433ca1e92595f2f3ebdb0f6 Binary files /dev/null and b/public/content/exercises/intro.pdf differ diff --git a/public/content/wiki/how_to_homework.html b/public/content/wiki/how_to_homework.html index 0981e612ffe25978bf7c2bcc23dab77c179e8768..facdbef82b6214ffea416a5355b5be640725579d 100644 --- a/public/content/wiki/how_to_homework.html +++ b/public/content/wiki/how_to_homework.html @@ -151,6 +151,7 @@ MathJax = { <li><a href="#login" id="toc-login" class="nav-link" data-scroll-target="#login">Login</a></li> <li><a href="#installation" id="toc-installation" class="nav-link" data-scroll-target="#installation">Installation</a></li> <li><a href="#working-with-jupyter-notebooks" id="toc-working-with-jupyter-notebooks" class="nav-link" data-scroll-target="#working-with-jupyter-notebooks">Working with Jupyter notebooks</a></li> + <li><a href="#working-with-python-scripts" id="toc-working-with-python-scripts" class="nav-link" data-scroll-target="#working-with-python-scripts">Working with Python scripts</a></li> <li><a href="#submitting-batch-jobs-to-the-cluster" id="toc-submitting-batch-jobs-to-the-cluster" class="nav-link" data-scroll-target="#submitting-batch-jobs-to-the-cluster">Submitting batch jobs to the cluster</a></li> <li><a href="#visualization-with-paraview" id="toc-visualization-with-paraview" class="nav-link" data-scroll-target="#visualization-with-paraview">Visualization with Paraview</a></li> </ul></li> @@ -160,6 +161,8 @@ MathJax = { <li><a href="#install-dolfinx" id="toc-install-dolfinx" class="nav-link" data-scroll-target="#install-dolfinx">Install Dolfinx</a></li> <li><a href="#use-our-container-linuxmac-only" id="toc-use-our-container-linuxmac-only" class="nav-link" data-scroll-target="#use-our-container-linuxmac-only">Use our Container (Linux/Mac only)</a></li> </ul></li> + <li><a href="#run-your-first-example-program" id="toc-run-your-first-example-program" class="nav-link" data-scroll-target="#run-your-first-example-program">Run your first example program</a></li> + <li><a href="#data-transfer-from-your-local-machine-to-the-cluster-and-back" id="toc-data-transfer-from-your-local-machine-to-the-cluster-and-back" class="nav-link" data-scroll-target="#data-transfer-from-your-local-machine-to-the-cluster-and-back">Data transfer from your local machine to the cluster and back</a></li> </ul></li> </ul> <div class="toc-actions"><ul><li><a href="https://git.rwth-aachen.de/mbd/courses/cmm/issues/new" class="toc-action"><i class="bi bi-git"></i>Report an issue</a></li></ul></div></nav> @@ -228,27 +231,106 @@ ls</code></pre> <li>Click the link or copy it to your browser</li> </ol> </section> +<section id="working-with-python-scripts" class="level3"> +<h3 class="anchored" data-anchor-id="working-with-python-scripts">Working with Python scripts</h3> +<ol type="1"> +<li><p>Open a terminal and navigate to your <code>CMM</code> folder.</p></li> +<li><p>Run your python script</p> +<pre><code>apptainer run dolfinx_latest.sif test.py</code></pre></li> +</ol> +</section> <section id="submitting-batch-jobs-to-the-cluster" class="level3"> <h3 class="anchored" data-anchor-id="submitting-batch-jobs-to-the-cluster">Submitting batch jobs to the cluster</h3> -<p>crea</p> +<p>T.b.d. (Currently not supported)</p> </section> <section id="visualization-with-paraview" class="level3"> <h3 class="anchored" data-anchor-id="visualization-with-paraview">Visualization with Paraview</h3> +<p><img src="images/paste-4.png" class="img-fluid"></p> +<ol type="1"> +<li><p>Open a terminal and navigate to your <code>CMM</code> folder.</p></li> +<li><p>Load the required module to start Paraview …</p> +<pre><code>module purge; +module load GCC/12.3.0; +module load OpenMPI/4.1.5; +module load ParaView/5.11.2</code></pre> +<p>… and open Paraview</p> +<pre><code>paraview</code></pre></li> +<li><p>Open output files that you created with FenicsX</p></li> +</ol> </section> </section> <section id="way-2-using-vs-code" class="level2"> <h2 class="anchored" data-anchor-id="way-2-using-vs-code">Way 2: Using VS-Code</h2> +<p><img src="images/paste-5.png" class="img-fluid"></p> +<ol type="1"> +<li>Install the ‘Remote - SSH’ Extension</li> +</ol> +<p><img src="images/paste-6.png" class="img-fluid"></p> +<ol start="2" type="1"> +<li>Open a remove window (bottom left green icon)</li> +<li>Select ‘Connect to Host’</li> +</ol> +<p><img src="images/paste-7.png" class="img-fluid"></p> +<ol start="4" type="1"> +<li><p>Login to a login node, e.g.</p> +<pre><code>login23-3.hpc.itc.rwth-aachen.de</code></pre></li> +</ol> +<p><img src="images/paste-8.png" class="img-fluid"></p> +<ol start="5" type="1"> +<li><p>Check that you are connected to the cluster</p></li> +<li><p>Download the Apptainer in the VS-Code terminal:</p> +<pre><code>mkdir CMM +cd CMM +apptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest +ls</code></pre></li> +<li><p>Select the <code>CMM</code> folder as your working directory</p></li> +</ol> +<p><img src="images/paste-14.png" class="img-fluid"></p> +<ol start="8" type="1"> +<li>In the terminal, start the Jupyter server and copy the link to the Jupyter server</li> +</ol> +<pre><code>apptainer run dolfinx_latest.sif notebook</code></pre> +<ol start="9" type="1"> +<li><p>Click ‘Select Kernel’</p></li> +<li><p>Click ‘Existing Jupyter Server’, paste the link to the Jupyter server, change the display name (e.g. Dolfinx)</p></li> +</ol> +<p><img src="images/paste-15.png" class="img-fluid"></p> +<ol start="11" type="1"> +<li>Select the ‘Python 3 (ipykernel)’ <code>/opt/conda/envs/fenicsx-env/bin/python</code>.</li> +</ol> +<p>Done.</p> </section> <section id="way-3-local-installation" class="level2"> <h2 class="anchored" data-anchor-id="way-3-local-installation">Way 3: Local installation</h2> +<p>If you want do develop locally, feel free to do so. There are two things to keep in mind:<br> +<br> +1. You are responsible to set things up</p> +<ol start="2" type="1"> +<li>Your submission needs run run on the environment me provide. Ensure that it there works before you submit your homework!</li> +</ol> <section id="install-dolfinx" class="level3"> <h3 class="anchored" data-anchor-id="install-dolfinx">Install Dolfinx</h3> +<p><a href="https://fenicsproject.org/download/" class="uri">https://fenicsproject.org/download/</a></p> </section> <section id="use-our-container-linuxmac-only" class="level3"> <h3 class="anchored" data-anchor-id="use-our-container-linuxmac-only">Use our Container (Linux/Mac only)</h3> +<ol type="1"> +<li><p>Install Apptainer: <a href="https://apptainer.org/docs/admin/main/installation.html" class="uri">https://apptainer.org/docs/admin/main/installation.html</a></p></li> +<li><p>Install our environment</p> +<pre><code>mkdir CMM +cd CMM +apptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest</code></pre></li> +<li><p>Install Paraview: <a href="https://www.paraview.org/" class="uri">https://www.paraview.org/</a></p></li> +</ol> +</section> +</section> +<section id="run-your-first-example-program" class="level2"> +<h2 class="anchored" data-anchor-id="run-your-first-example-program">Run your first example program</h2> +</section> +<section id="data-transfer-from-your-local-machine-to-the-cluster-and-back" class="level2"> +<h2 class="anchored" data-anchor-id="data-transfer-from-your-local-machine-to-the-cluster-and-back">Data transfer from your local machine to the cluster and back</h2> -</section> </section> </section> diff --git a/public/content/wiki/images/paste-14.png b/public/content/wiki/images/paste-14.png new file mode 100644 index 0000000000000000000000000000000000000000..905ac1c9f6ed2ba376e7546463ef92e70547b84a Binary files /dev/null and b/public/content/wiki/images/paste-14.png differ diff --git a/public/content/wiki/images/paste-15.png b/public/content/wiki/images/paste-15.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd7869fa485dd27513aa3f24ab5c770875f70f0 Binary files /dev/null and b/public/content/wiki/images/paste-15.png differ diff --git a/public/content/wiki/images/paste-4.png b/public/content/wiki/images/paste-4.png new file mode 100644 index 0000000000000000000000000000000000000000..061a567dbd1a98b18e84cfa41842afde7ebe00f5 Binary files /dev/null and b/public/content/wiki/images/paste-4.png differ diff --git a/public/content/wiki/images/paste-5.png b/public/content/wiki/images/paste-5.png new file mode 100644 index 0000000000000000000000000000000000000000..4d724baaf250899a5426fc7413d21a8625231d3c Binary files /dev/null and b/public/content/wiki/images/paste-5.png differ diff --git a/public/content/wiki/images/paste-6.png b/public/content/wiki/images/paste-6.png new file mode 100644 index 0000000000000000000000000000000000000000..88a3337d83983eeef36025a001924179f6ac4cbd Binary files /dev/null and b/public/content/wiki/images/paste-6.png differ diff --git a/public/content/wiki/images/paste-7.png b/public/content/wiki/images/paste-7.png new file mode 100644 index 0000000000000000000000000000000000000000..1f326917ae3729f85c774b02d0d8d72934e1ad46 Binary files /dev/null and b/public/content/wiki/images/paste-7.png differ diff --git a/public/content/wiki/images/paste-8.png b/public/content/wiki/images/paste-8.png new file mode 100644 index 0000000000000000000000000000000000000000..e092a6a21e26f7a6346c282366b95df2735c45cb Binary files /dev/null and b/public/content/wiki/images/paste-8.png differ diff --git a/public/listings.json b/public/listings.json index f549beab31ee63cb5c4b9c04a703905b627b6ca8..30f53a00dbd5ba9478dcc41d8000ad5e84091e62 100644 --- a/public/listings.json +++ b/public/listings.json @@ -1,6 +1,6 @@ [ { - "listing": "/content/resources/index-student.html", + "listing": "/content/exam/index-student.html", "items": [] }, { @@ -13,7 +13,7 @@ ] }, { - "listing": "/content/exam/index-student.html", + "listing": "/content/resources/index-student.html", "items": [] } ] \ No newline at end of file diff --git a/public/public-lecturer/content/exercises/homework02.html b/public/public-lecturer/content/exercises/homework02.html index 8e8f1147fd8abdbb2b4e405cdee7e09f80a399fe..7026e5634404f6acd283f84d2d277d20790837cb 100644 --- a/public/public-lecturer/content/exercises/homework02.html +++ b/public/public-lecturer/content/exercises/homework02.html @@ -495,7 +495,7 @@ window.Quarto = { <section id="venturi-effect" class="level1"> <h1>Venturi Effect</h1> <p>The figure shows a Venturi tube, which can be used to measure fluid flow. It comprises a cylindrical inlet with cross section <span class="math inline">\(A_1\)</span> followed by a convergent entrance into a cylindrical throat with cross section <span class="math inline">\(A_2\)</span> and a divergent outlet. The velocity of the fluid at inlet and the throat is <span class="math inline">\(\mathbf{v}_1\)</span> and <span class="math inline">\(\mathbf{v}_2\)</span> respectively. The flowing fluid has density <span class="math inline">\(\rho_a\)</span> and the liquid in the U-shaped tube has a density <span class="math inline">\(\rho_f\)</span>.</p> -<p><img src="homework02_files/figure-html/2a1e164d-aca7-497f-9ddc-f5ebcc32bfa8-2-../../content/exercises/images/venturi_tube.png" class="img-fluid"></p> +<p><img src="homework02_files/figure-html/5df5ebc5-d1b9-4221-8adc-1de6b150266c-2-../../content/exercises/images/venturi_tube.png" class="img-fluid"></p> <section id="tasks-1" class="level2"> <h2 class="anchored" data-anchor-id="tasks-1">Tasks</h2> <section id="task-1-1" class="level3"> @@ -515,7 +515,7 @@ window.Quarto = { <section id="spinning-fluid" class="level1"> <h1>Spinning Fluid</h1> <p>Consider a stationary cylindrical glass with inner radius <span class="math inline">\(R\)</span> and partially filled with water upto height <span class="math inline">\(H\)</span>. The ambient pressure is given by <span class="math inline">\(p_a\)</span>. The glass is now spun about its central axis with an angular velocity <span class="math inline">\(\Omega\)</span>, which causes the top surface of the water to form a parabolloid. A selected cross section of the stationary and spinning glass with fluid is shown in the figure.</p> -<p><img src="homework02_files/figure-html/2a1e164d-aca7-497f-9ddc-f5ebcc32bfa8-1-../../content/exercises/images/spinning_fluid.png" class="img-fluid"></p> +<p><img src="homework02_files/figure-html/5df5ebc5-d1b9-4221-8adc-1de6b150266c-1-../../content/exercises/images/spinning_fluid.png" class="img-fluid"></p> <section id="tasks-2" class="level2"> <h2 class="anchored" data-anchor-id="tasks-2">Tasks</h2> <section id="task-1-2" class="level3"> @@ -624,7 +624,7 @@ sin(\theta) & cos(\theta) \\ \]</span></p> <!-- the svg (inkscape) graphic is included in this folder, in case it needs to be modified --> <figure id="fig-problem" class="figure"> -<img src="homework02_files/figure-html/bd9f7473-415e-47cf-810b-68fce31fd0d1-1-../../content/problems/problems/p-weak_form_linear_elastics/problem.png" class="figure-img"> +<img src="homework02_files/figure-html/9cf83ce2-3496-4794-9e9b-21df3b243291-1-../../content/problems/problems/p-weak_form_linear_elastics/problem.png" class="figure-img"> <figcaption> Figure 1 </figcaption> diff --git a/public/public-lecturer/content/exercises/homework04.html b/public/public-lecturer/content/exercises/homework04.html index 2120d25d64b05c0dea09c3d65ddebc74aae16ca3..df94269887884803660afaf2e4fec64c54115379 100644 --- a/public/public-lecturer/content/exercises/homework04.html +++ b/public/public-lecturer/content/exercises/homework04.html @@ -224,7 +224,7 @@ window.Quarto = { <section id="pipe-flow" class="level1"> <h1>Pipe Flow</h1> <p>Consider the incompressible flow of a Newtonian fluid along a pipe of constant radius <span class="math inline">\(a\)</span> with fixed walls. A schematic is shown in the figure below. The velocity can be written as <span class="math inline">\(\vec{u}=u_r\vec{e}_{r}+u_{\theta}\vec{e}_{\theta}+u_z\vec{e}_{z}\)</span>.</p> -<p><img src="homework04_files/figure-html/cab3f69f-68da-4998-b55d-a3b0e64a9f5e-1-../../content/exercises/images/pipeflow.png" class="img-fluid"></p> +<p><img src="homework04_files/figure-html/d2466cd7-5901-45f1-b18d-8f47dd1accc0-1-../../content/exercises/images/pipeflow.png" class="img-fluid"></p> <p><span id="eq-ins-scaling-INS"><span class="math display">\[ \begin{aligned} \nabla \cdot \mathbf u &= 0 \\ diff --git a/public/public-lecturer/content/exercises/homework06.html b/public/public-lecturer/content/exercises/homework06.html index b385727cc09b53e9726a9613aff0883ec59c8d20..f0ed724e541201a5e86300261ed01af4e3323cf6 100644 --- a/public/public-lecturer/content/exercises/homework06.html +++ b/public/public-lecturer/content/exercises/homework06.html @@ -276,7 +276,7 @@ window.Quarto = { \end{aligned} \qquad(3)\]</span></span></p> <p>where <span class="math inline">\(\alpha\)</span> is the thermal diffusivity and <span class="math inline">\(D\)</span> is the mass diffusivity.</p> -<p><img src="homework06_files/figure-html/7eb6b2ef-8016-4060-8026-aad83c6bff1a-1-../../content/problems/problems/p-stefan_composite/image_stefan_composite.png" class="img-fluid"></p> +<p><img src="homework06_files/figure-html/7d321071-ade8-474c-80f6-9ee13844d483-1-../../content/problems/problems/p-stefan_composite/image_stefan_composite.png" class="img-fluid"></p> <p>Cooling from the left will induce a phase interface to propagate from left to right through the domain. It’s position is described by <span class="math inline">\(X(t)\)</span> (see lecture). The boundary and interface conditions are given by:</p> <p>Temperature <span class="math inline">\(T\)</span>:</p> <ol type="1"> diff --git a/public/public-lecturer/content/exercises/homework_template.html b/public/public-lecturer/content/exercises/homework_template.html index 144b1bd174b496a5e2506561560d78c96c1bee8f..c30676ecba8658ce6ec9fd210a6d5978806b3191 100644 --- a/public/public-lecturer/content/exercises/homework_template.html +++ b/public/public-lecturer/content/exercises/homework_template.html @@ -235,7 +235,7 @@ window.Quarto = { <section id="task-a-import-a-full-problem" class="level1"> <h1>Task A: import a full problem</h1> <p>Consider a stationary cylindrical glass with inner radius <span class="math inline">\(R\)</span> and partially filled with water upto height <span class="math inline">\(H\)</span>. The ambient pressure is given by <span class="math inline">\(p_a\)</span>. The glass is now spun about its central axis with an angular velocity <span class="math inline">\(\Omega\)</span>, which causes the top surface of the water to form a parabolloid. A selected cross section of the stationary and spinning glass with fluid is shown in the figure.</p> -<p><img src="homework_template_files/figure-html/166294c9-dbaa-418b-a260-3ce1b7f0d3fc-1-../../content/exercises/images/spinning_fluid.png" class="img-fluid"></p> +<p><img src="homework_template_files/figure-html/5e223bf0-ea60-44d8-8457-64a27129d432-1-../../content/exercises/images/spinning_fluid.png" class="img-fluid"></p> <section id="tasks" class="level2"> <h2 class="anchored" data-anchor-id="tasks">Tasks</h2> <section id="task-1" class="level3"> diff --git a/public/public-lecturer/content/exercises/intro.out.html b/public/public-lecturer/content/exercises/intro.out.html new file mode 100644 index 0000000000000000000000000000000000000000..f3dbb553842653b5c0e7f281eb86d0c5ec8804c2 --- /dev/null +++ b/public/public-lecturer/content/exercises/intro.out.html @@ -0,0 +1,1005 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> + +<meta charset="utf-8"> +<meta name="generator" content="quarto-1.6.42"> + +<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> + + +<title>intro.out</title> +<style> +code{white-space: pre-wrap;} +span.smallcaps{font-variant: small-caps;} +div.columns{display: flex; gap: min(4vw, 1.5em);} +div.column{flex: auto; overflow-x: auto;} +div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} +ul.task-list{list-style: none;} +ul.task-list li input[type="checkbox"] { + width: 0.8em; + margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ + vertical-align: middle; +} +/* CSS for syntax highlighting */ +pre > code.sourceCode { white-space: pre; position: relative; } +pre > code.sourceCode > span { line-height: 1.25; } +pre > code.sourceCode > span:empty { height: 1.2em; } +.sourceCode { overflow: visible; } +code.sourceCode > span { color: inherit; text-decoration: inherit; } +div.sourceCode { margin: 1em 0; } +pre.sourceCode { margin: 0; } +@media screen { +div.sourceCode { overflow: auto; } +} +@media print { +pre > code.sourceCode { white-space: pre-wrap; } +pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; } +} +pre.numberSource code + { counter-reset: source-line 0; } +pre.numberSource code > span + { position: relative; left: -4em; counter-increment: source-line; } +pre.numberSource code > span > a:first-child::before + { content: counter(source-line); + position: relative; left: -1em; text-align: right; vertical-align: baseline; + border: none; display: inline-block; + -webkit-touch-callout: none; -webkit-user-select: none; + -khtml-user-select: none; -moz-user-select: none; + -ms-user-select: none; user-select: none; + padding: 0 4px; width: 4em; + } +pre.numberSource { margin-left: 3em; padding-left: 4px; } +div.sourceCode + { } +@media screen { +pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; } +} +</style> + + +<script src="../../../site_libs/quarto-nav/quarto-nav.js"></script> +<script src="../../../site_libs/quarto-nav/headroom.min.js"></script> +<script src="../../../site_libs/clipboard/clipboard.min.js"></script> +<script src="../../../site_libs/quarto-search/autocomplete.umd.js"></script> +<script src="../../../site_libs/quarto-search/fuse.min.js"></script> +<script src="../../../site_libs/quarto-search/quarto-search.js"></script> +<meta name="quarto:offset" content="../../../"> +<link href="../../../images/logo.png" rel="icon" type="image/png"> +<script src="../../../site_libs/quarto-html/quarto.js"></script> +<script src="../../../site_libs/quarto-html/popper.min.js"></script> +<script src="../../../site_libs/quarto-html/tippy.umd.min.js"></script> +<script src="../../../site_libs/quarto-html/anchor.min.js"></script> +<link href="../../../site_libs/quarto-html/tippy.css" rel="stylesheet"> +<link href="../../../site_libs/quarto-html/quarto-syntax-highlighting-2f5df379a58b258e96c21c0638c20c03.css" rel="stylesheet" id="quarto-text-highlighting-styles"> +<script src="../../../site_libs/bootstrap/bootstrap.min.js"></script> +<link href="../../../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> +<link href="../../../site_libs/bootstrap/bootstrap-55429a99459c888cfb74d368a6a930e5.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> +<script id="quarto-search-options" type="application/json">{ + "location": "navbar", + "copy-button": false, + "collapse-after": 3, + "panel-placement": "end", + "type": "overlay", + "limit": 50, + "keyboard-shortcut": [ + "f", + "/", + "s" + ], + "language": { + "search-no-results-text": "No results", + "search-matching-documents-text": "matching documents", + "search-copy-link-title": "Copy link to search", + "search-hide-matches-text": "Hide additional matches", + "search-more-match-text": "more match in this document", + "search-more-matches-text": "more matches in this document", + "search-clear-button-title": "Clear", + "search-text-placeholder": "", + "search-detached-cancel-button-title": "Cancel", + "search-submit-button-title": "Submit", + "search-label": "Search" + } +}</script> +<script> +MathJax = { + tex: { + tags: 'ams' + } +}; +</script> + + <script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script> + <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script> + +<script type="text/javascript"> +const typesetMath = (el) => { + if (window.MathJax) { + // MathJax Typeset + window.MathJax.typeset([el]); + } else if (window.katex) { + // KaTeX Render + var mathElements = el.getElementsByClassName("math"); + var macros = []; + for (var i = 0; i < mathElements.length; i++) { + var texText = mathElements[i].firstChild; + if (mathElements[i].tagName == "SPAN") { + window.katex.render(texText.data, mathElements[i], { + displayMode: mathElements[i].classList.contains('display'), + throwOnError: false, + macros: macros, + fleqn: false + }); + } + } + } +} +window.Quarto = { + typesetMath +}; +</script> + +<link rel="stylesheet" href="../../../styles.css"> +</head> + +<body class="nav-fixed"> + +<div id="quarto-search-results"></div> + <header id="quarto-header" class="headroom fixed-top"> + <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> + <div class="navbar-container container-fluid"> + <div class="navbar-brand-container mx-auto"> + <a href="../../../index.html" class="navbar-brand navbar-brand-logo"> + <img src="../../../images/rwth_mbd_bild_rgb.png" alt="" class="navbar-logo"> + </a> + </div> + <div id="quarto-search" class="" title="Search"></div> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> + <span class="navbar-toggler-icon"></span> +</button> + <div class="collapse navbar-collapse" id="navbarCollapse"> + <ul class="navbar-nav navbar-nav-scroll me-auto"> + <li class="nav-item"> + <a class="nav-link" href="../../../content/script/chapters/generalremarks.html"> +<span class="menu-text">Script</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../../../content/schedule/schedule.html"> +<span class="menu-text">Schedule</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../../../content/slides/index-student.html"> +<span class="menu-text">Slides</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../../../content/resources/index-student.html"> +<span class="menu-text">Resources</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../../../content/exercises/index.html"> +<span class="menu-text">Exercises</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../../../content/exam/index-student.html"> +<span class="menu-text">Exam</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="../../../content/wiki/index.html"> +<span class="menu-text">Wiki</span></a> + </li> +</ul> + </div> <!-- /navcollapse --> + <div class="quarto-navbar-tools"> +</div> + </div> <!-- /container-fluid --> + </nav> + <div id="quarto-announcement" data-announcement-id="951b826953e5dd7c5c32434d2e090ab6" class="alert alert-primary hidden"><i class="bi bi-info-circle quarto-announcement-icon"></i><div class="quarto-announcement-content"> +<p><strong>Alert</strong> - Please ensure that you refresh this webpage without using your browsers cache. Issues have been reported that the website otherwise may be out of date. See <a href="content/wiki/index.html#sec-wiki-webpage_out_of_date">here</a> for more information.</p> +</div><i class="bi bi-x-lg quarto-announcement-action"></i></div> +</header> +<!-- content --> +<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> +<!-- sidebar --> +<!-- margin-sidebar --> + <div id="quarto-margin-sidebar" class="sidebar margin-sidebar"> + <nav id="TOC" role="doc-toc" class="toc-active"> + <h2 id="toc-title">On this page</h2> + + <ul> + <li><a href="#learning-goals" id="toc-learning-goals" class="nav-link active" data-scroll-target="#learning-goals">Learning goals</a></li> + <li><a href="#poisson-model" id="toc-poisson-model" class="nav-link" data-scroll-target="#poisson-model">Poisson model</a></li> + <li><a href="#structure" id="toc-structure" class="nav-link" data-scroll-target="#structure">Structure</a></li> + <li><a href="#lets-go" id="toc-lets-go" class="nav-link" data-scroll-target="#lets-go">Let’s go!</a></li> + <li><a href="#mesh-and-computational-domain" id="toc-mesh-and-computational-domain" class="nav-link" data-scroll-target="#mesh-and-computational-domain">Mesh and computational domain</a></li> + <li><a href="#the-variational-problem" id="toc-the-variational-problem" class="nav-link" data-scroll-target="#the-variational-problem">The variational problem</a></li> + <li><a href="#a-weak-form-for-the-poisson-equation" id="toc-a-weak-form-for-the-poisson-equation" class="nav-link" data-scroll-target="#a-weak-form-for-the-poisson-equation">A weak form for the Poisson equation</a></li> + <li><a href="#our-first-finite-element" id="toc-our-first-finite-element" class="nav-link" data-scroll-target="#our-first-finite-element">Our first finite element</a></li> + <li><a href="#from-math-to-code-the-weak-form-and-ufl" id="toc-from-math-to-code-the-weak-form-and-ufl" class="nav-link" data-scroll-target="#from-math-to-code-the-weak-form-and-ufl"><em>From Math to Code:</em> the weak form and UFL</a></li> + <li><a href="#boundary-conditions" id="toc-boundary-conditions" class="nav-link" data-scroll-target="#boundary-conditions">Boundary conditions</a></li> + <li><a href="#assemble-and-solve-the-linear-system" id="toc-assemble-and-solve-the-linear-system" class="nav-link" data-scroll-target="#assemble-and-solve-the-linear-system">Assemble and solve the linear system</a></li> + <li><a href="#this-is-where-the-magic-happens" id="toc-this-is-where-the-magic-happens" class="nav-link" data-scroll-target="#this-is-where-the-magic-happens">This is where the magic happens</a></li> + <li><a href="#visualization" id="toc-visualization" class="nav-link" data-scroll-target="#visualization">Visualization</a></li> + <li><a href="#post-processing-with-paraview" id="toc-post-processing-with-paraview" class="nav-link" data-scroll-target="#post-processing-with-paraview">Post-processing with Paraview</a></li> + <li><a href="#verification-comparing-with-the-exact-solution" id="toc-verification-comparing-with-the-exact-solution" class="nav-link" data-scroll-target="#verification-comparing-with-the-exact-solution"><em>Verification</em>: Comparing with the exact solution</a></li> + </ul> +<div class="toc-actions"><ul><li><a href="https://git.rwth-aachen.de/mbd/courses/cmm/issues/new" class="toc-action"><i class="bi bi-git"></i>Report an issue</a></li></ul></div></nav> + </div> +<!-- main --> +<main class="content" id="quarto-document-content"><header id="title-block-header" class="quarto-title-block"></header> + + + + +<p>This notebook gives a small introduction to FenicsX, an open-source FEM library. We use the Python API of FenicsX to solve an example PDE problem.</p> +<section id="learning-goals" class="level2"> +<h2 class="anchored" data-anchor-id="learning-goals">Learning goals</h2> +<ul> +<li>Understand the basic structure of a FenicsX program</li> +<li>Learn the basic building blocks of modern FEM software: <strong>mesh</strong>, <strong>function space</strong>, <strong>boundary conditions</strong>, <strong>weak form</strong>, and <strong>solvers</strong></li> +</ul> +</section> +<section id="poisson-model" class="level2"> +<h2 class="anchored" data-anchor-id="poisson-model">Poisson model</h2> +<p>In this example, we solve the classical Poisson equation for a scalar <span class="math inline">\(u\)</span>,</p> +<p><span class="math display">\[ +-\Delta u = f \text{ in } \Omega = \left[0, \,1\right] \times \left[0,\,1\right], \quad u = g \text{ on } \partial\Omega \quad , +\]</span></p> +<p>where <span class="math inline">\(\Omega\)</span> is the domain of interest, <span class="math inline">\(f\)</span> is a given scalar source term, and <span class="math inline">\(g\)</span> is a Dirichlet boundary condition.</p> +</section> +<section id="structure" class="level2"> +<h2 class="anchored" data-anchor-id="structure">Structure</h2> +<p>Below, we learn how to</p> +<ol type="1"> +<li>create a mesh for a simple domain</li> +<li>pick discrete FEM function spaces (<em>which functions do we use to approximate the PDE solution?</em>)</li> +<li>define the weak form of the PDE</li> +<li>apply boundary conditions</li> +<li>assemble and solve the linear system resulting from the discretization</li> +<li>visualize the solution</li> +</ol> +</section> +<section id="lets-go" class="level2"> +<h2 class="anchored" data-anchor-id="lets-go">Let’s go!</h2> +<p>First, we import some of the necessary python libraries</p> +<div id="67992112" class="cell" data-execution_count="1"> +<div class="sourceCode cell-code" id="cb1"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> mpi4py <span class="im">import</span> MPI</span> +<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span> +<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> tqdm.autonotebook</span> +<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="cf">try</span>:</span> +<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="im">import</span> os</span> +<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> username <span class="op">=</span> os.getenv(<span class="st">"USER"</span>) <span class="kw">or</span> os.geteuid()</span> +<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> <span class="co"># Set XDG_RUNTIME_DIR to a valid directory</span></span> +<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> os.environ[<span class="st">"XDG_RUNTIME_DIR"</span>] <span class="op">=</span> <span class="ss">f"/tmp/runtime-</span><span class="sc">{</span>username<span class="sc">}</span><span class="ss">"</span></span> +<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> os.makedirs(os.environ[<span class="st">"XDG_RUNTIME_DIR"</span>], exist_ok<span class="op">=</span><span class="va">True</span>)</span> +<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> os.chmod(os.environ[<span class="st">"XDG_RUNTIME_DIR"</span>], <span class="bn">0o700</span>)</span> +<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a><span class="cf">except</span> <span class="pp">Exception</span> <span class="im">as</span> e:</span> +<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span>(<span class="ss">f"Failed to set XDG_RUNTIME_DIR: </span><span class="sc">{</span>e<span class="sc">}</span><span class="ss">"</span>)</span> +<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span>(<span class="st">"You might get some warnings, but it should still work."</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-stderr"> +<pre><code>/tmp/ipykernel_3316/138077527.py:3: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + import tqdm.autonotebook</code></pre> +</div> +</div> +</section> +<section id="mesh-and-computational-domain" class="level2"> +<h2 class="anchored" data-anchor-id="mesh-and-computational-domain">Mesh and computational domain</h2> +<p>The basis for our discretization is a discrete approximation <span class="math inline">\(\Omega_h\)</span> of the computational domain.</p> +<p>Here, he have the choice between different discretization types, e.g. quadrilateral, triangular etc.</p> +<div id="69e562fe" class="cell" data-execution_count="2"> +<div class="sourceCode cell-code" id="cb3"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx <span class="im">import</span> mesh</span> +<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>number_elements <span class="op">=</span> <span class="dv">5</span></span> +<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a>domain <span class="op">=</span> mesh.create_unit_square(</span> +<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a> MPI.COMM_WORLD, number_elements, <span class="dv">1</span>, cell_type<span class="op">=</span>mesh.CellType.quadrilateral</span> +<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +</div> +</section> +<section id="the-variational-problem" class="level2"> +<h2 class="anchored" data-anchor-id="the-variational-problem">The variational problem</h2> +<p>A key step in building finite element methods is the weak form of the PDE, upon which the discrete variational problem is based.</p> +<p>In all cases, the weak form is obtained by multiplying the PDE with a test function <span class="math inline">\(v\)</span> and integrating over the domain <span class="math inline">\(\Omega\)</span>.</p> +<p>Further operations on the resulting integral equations, such as integration by parts, can then be applied. This is often done improve the properties of the method, for example to - reduce the required regularity (<em>we need less derivatives of the solution to exist</em>) and hence allow for lower-order (<em>=cheaper</em>) finite element spaces - introduce symmetry to the (bi-)linear forms, which is favored by many linear solvers - introduce certain natural boundary conditions, e.g. the terms that appear as boundary integrals in the weak form</p> +<p>A first key realization is that the weak form for a given PDE is <strong>not</strong> unique.</p> +</section> +<section id="a-weak-form-for-the-poisson-equation" class="level2"> +<h2 class="anchored" data-anchor-id="a-weak-form-for-the-poisson-equation">A weak form for the Poisson equation</h2> +<p>A typical variational problem for the Poisson equation is given by</p> +<p>Find <span class="math inline">\(u \in V\)</span> such that <span class="math display">\[ +\int_\Omega \nabla u_h \cdot \nabla v_h \, dx - \cancel{\int_{\partial\Omega} \mathbf{\nabla} u_h \cdot \mathbf{n} \, v_h \, ds} = \int_\Omega f v_h \, dx +\]</span> for all <span class="math inline">\(v \in V_{0}\)</span>. Here <span class="math inline">\(\mathbf{n}\)</span> is the outward normal vector on the boundary <span class="math inline">\(\partial\Omega\)</span> and <span class="math inline">\(V_{0}\)</span> is the space of functions that vanish on the boundary, hence the boundary integral vanishes.</p> +<p>The discrete variational problem is obtained by replacing the continous domain <span class="math inline">\(\Omega\)</span> with its discrete approximation <span class="math inline">\(\Omega_h\)</span> (<em>our mesh</em>) and the continuous trial and test spaces <span class="math inline">\(V\)</span> and <span class="math inline">\(V_{0}\)</span> with the discrete finite element spaces <span class="math inline">\(V_h\)</span> and <span class="math inline">\(V_{h,0}\)</span>, respectively.</p> +<p><em>Technical note:</em> By default, FenicsX test functions are zero on parts of the boundary where Dirichlet conditions are applied. Since we only use Dirichlet condiitons in this example, we don’t have to worry about the boundary integral term and we omit the <span class="math inline">\(V_{h,0}\)</span> notation.</p> +</section> +<section id="our-first-finite-element" class="level2"> +<h2 class="anchored" data-anchor-id="our-first-finite-element">Our first finite element</h2> +<p>The term “finite element” refers to the basis functions defined on our mesh. The idea of the finite element method is to find the best approximation of the solution <span class="math inline">\(u\)</span> in a finite-dimensional function space <span class="math inline">\(V_h\)</span>.</p> +<p>We thus have to pick a finite element function space <span class="math inline">\(V_h\)</span> on our mesh.</p> +<p>Typically, the choice of the function space is crucial for the accuracy and convergence of the method (<em>lego block analogy</em>)</p> +<p>Let’s start with a simple linear polynomial function space on the quadrilateral mesh that we created (<em>check out what it looks like <a href="https://defelement.org/elements/examples/quadrilateral-lagrange-equispaced-1.html">here</a></em>)</p> +<div id="0c51c699" class="cell" data-execution_count="3"> +<div class="sourceCode cell-code" id="cb4"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="co"># used for plotting</span></span> +<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.fem <span class="im">import</span> functionspace, Function, Constant, form</span> +<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> basix.ufl <span class="im">import</span> element</span> +<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>mesh_element_name <span class="op">=</span> domain.topology.cell_name() </span> +<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a><span class="co">""" type of mesh element, e.g. "quadrilateral" """</span></span> +<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a>basis_functions_degree <span class="op">=</span> <span class="dv">1</span></span> +<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a><span class="co">""" degree of the finite basis functions """</span></span> +<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a>finite_element <span class="op">=</span> element(</span> +<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a> family<span class="op">=</span><span class="st">"CG"</span>, cell<span class="op">=</span>domain.topology.cell_name(), degree<span class="op">=</span>basis_functions_degree</span> +<span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a>discrete_fem_space <span class="op">=</span> functionspace(mesh<span class="op">=</span>domain, element<span class="op">=</span>finite_element)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +</div> +<p>Lets have a look at our beautiful mesh:</p> +<div id="ef716852" class="cell" data-execution_count="4"> +<div class="sourceCode cell-code" id="cb5"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="cf">try</span>:</span> +<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a> shell <span class="op">=</span> get_ipython().__class__.<span class="va">__name__</span></span> +<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a> has_visualization <span class="op">=</span> <span class="va">True</span> </span> +<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="cf">except</span> <span class="pp">NameError</span>:</span> +<span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a> has_visualization <span class="op">=</span> <span class="va">False</span></span> +<span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> has_visualization:</span> +<span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a> <span class="im">import</span> pyvista</span> +<span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a> <span class="im">import</span> dolfinx</span> +<span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a> <span class="co"># Set the default window size globally</span></span> +<span id="cb5-12"><a href="#cb5-12" aria-hidden="true" tabindex="-1"></a> pyvista.global_theme.window_size <span class="op">=</span> (<span class="dv">600</span>, <span class="dv">600</span>) <span class="co"># Adjust width and height as needed</span></span> +<span id="cb5-13"><a href="#cb5-13" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-14"><a href="#cb5-14" aria-hidden="true" tabindex="-1"></a> pyvista.set_jupyter_backend(<span class="st">"static"</span>)</span> +<span id="cb5-15"><a href="#cb5-15" aria-hidden="true" tabindex="-1"></a> pyvista.start_xvfb()</span> +<span id="cb5-16"><a href="#cb5-16" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-17"><a href="#cb5-17" aria-hidden="true" tabindex="-1"></a> <span class="co"># Extract topology from mesh and create pyvista mesh</span></span> +<span id="cb5-18"><a href="#cb5-18" aria-hidden="true" tabindex="-1"></a> topology, cell_types, x <span class="op">=</span> dolfinx.plot.vtk_mesh(discrete_fem_space)</span> +<span id="cb5-19"><a href="#cb5-19" aria-hidden="true" tabindex="-1"></a> grid <span class="op">=</span> pyvista.UnstructuredGrid(topology, cell_types, x)</span> +<span id="cb5-20"><a href="#cb5-20" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-21"><a href="#cb5-21" aria-hidden="true" tabindex="-1"></a> plotter <span class="op">=</span> pyvista.Plotter()</span> +<span id="cb5-22"><a href="#cb5-22" aria-hidden="true" tabindex="-1"></a> plotter.add_title(<span class="ss">f"Mesh with </span><span class="sc">{</span>number_elements<span class="sc">}</span><span class="ss"> elements"</span>)</span> +<span id="cb5-23"><a href="#cb5-23" aria-hidden="true" tabindex="-1"></a> plotter.add_mesh(grid, show_edges<span class="op">=</span><span class="va">True</span>)</span> +<span id="cb5-24"><a href="#cb5-24" aria-hidden="true" tabindex="-1"></a> plotter.camera_position <span class="op">=</span> <span class="st">"xy"</span></span> +<span id="cb5-25"><a href="#cb5-25" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb5-26"><a href="#cb5-26" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="kw">not</span> pyvista.OFF_SCREEN:</span> +<span id="cb5-27"><a href="#cb5-27" aria-hidden="true" tabindex="-1"></a> plotter.show()</span> +<span id="cb5-28"><a href="#cb5-28" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span>:</span> +<span id="cb5-29"><a href="#cb5-29" aria-hidden="true" tabindex="-1"></a> plotter.screenshot(<span class="st">"mesh.png"</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-display"> +<div> +<figure class="figure"> +<p><img src="intro.out_files/figure-html/cell-5-output-1.png" class="img-fluid figure-img"></p> +</figure> +</div> +</div> +</div> +</section> +<section id="from-math-to-code-the-weak-form-and-ufl" class="level2"> +<h2 class="anchored" data-anchor-id="from-math-to-code-the-weak-form-and-ufl"><em>From Math to Code:</em> the weak form and UFL</h2> +<p>The main advantage of software like FenicsX is that it provides a way to work in a syntax that is very close to the mathematical notation of the weak form. The underlying syntax is called <strong>UFL</strong> (Unified Form Language) and is a domain-specific language for finite element variational forms.</p> +<p>Let’s see how we can write the weak form in UFL.</p> +<div id="5804d191" class="cell" data-execution_count="5"> +<div class="sourceCode cell-code" id="cb6"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> ufl <span class="im">import</span> TestFunction, TrialFunction, dot, ds, dx, grad</span> +<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a>V_h <span class="op">=</span> discrete_fem_space</span> +<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a><span class="co">""" Discrete finite element space """</span></span> +<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a>u_h <span class="op">=</span> TrialFunction(V_h)</span> +<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a><span class="co">""" discrete trial function """</span></span> +<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a>v_h <span class="op">=</span> TestFunction(V_h)</span> +<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a><span class="co">""" discrete test function """</span></span> +<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a>f <span class="op">=</span> Constant(domain, <span class="fl">0.0</span>)</span> +<span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a><span class="co">""" right-hand side source term """</span></span> +<span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb6-14"><a href="#cb6-14" aria-hidden="true" tabindex="-1"></a><span class="co"># Define the weak form lhs == rhs</span></span> +<span id="cb6-15"><a href="#cb6-15" aria-hidden="true" tabindex="-1"></a>weak_form_lhs <span class="op">=</span> dot(grad(u_h), grad(v_h)) <span class="op">*</span> dx</span> +<span id="cb6-16"><a href="#cb6-16" aria-hidden="true" tabindex="-1"></a>weak_form_rhs <span class="op">=</span> f <span class="op">*</span> v_h <span class="op">*</span> dx</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +</div> +</section> +<section id="boundary-conditions" class="level2"> +<h2 class="anchored" data-anchor-id="boundary-conditions">Boundary conditions</h2> +<p>There are a couple of ways to apply boundary conditions in FenicsX. We cover the simplest way to set Dirichlet boundary conditions.</p> +<p>The basic idea is to tell FenicsX where we want to apply the Dirichlet boundary condition in terms of the mesh and then let the software figure out which nodes and facets of the mesh coincide with that geometrical location.</p> +<p>We therefore start by defining functions to tell FenicsX what we consider to be the left and right boundary of the domain (<span class="math inline">\(x=0\)</span> and <span class="math inline">\(x=1\)</span>).</p> +<div id="e68f61c8" class="cell" data-execution_count="6"> +<div class="sourceCode cell-code" id="cb7"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="co"># return 1 on the left boundary of the unit square, e.g when x = (x,y)[0] close to 0</span></span> +<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> left_boundary_marker(x):</span> +<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> np.isclose(x[<span class="dv">0</span>], <span class="fl">0.0</span>)</span> +<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a><span class="co"># return 1 on the right boundary of the unit square, e.g when x = (x,y)[0] close to 1</span></span> +<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> right_boundary_marker(x):</span> +<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> np.isclose(x[<span class="dv">0</span>], <span class="fl">1.0</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +</div> +<p>We now create two boundary conditions for a constant value of <span class="math inline">\(g=1\)</span> on the left boundary and <span class="math inline">\(g=0\)</span> on the right boundary.</p> +<div id="e0266dc5" class="cell" data-execution_count="7"> +<div class="sourceCode cell-code" id="cb8"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.fem <span class="im">import</span> dirichletbc, locate_dofs_topological</span> +<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.mesh <span class="im">import</span> locate_entities_boundary</span> +<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a>mesh_topology_dim <span class="op">=</span> domain.topology.dim</span> +<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a>facet_geometrical_dimension <span class="op">=</span> mesh_topology_dim <span class="op">-</span> <span class="dv">1</span></span> +<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a>facets_on_left_boundary <span class="op">=</span> locate_entities_boundary(</span> +<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a> domain, facet_geometrical_dimension, left_boundary_marker</span> +<span id="cb8-9"><a href="#cb8-9" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb8-10"><a href="#cb8-10" aria-hidden="true" tabindex="-1"></a>dofs_on_left_boundary <span class="op">=</span> locate_dofs_topological(</span> +<span id="cb8-11"><a href="#cb8-11" aria-hidden="true" tabindex="-1"></a> V_h, facet_geometrical_dimension, facets_on_left_boundary</span> +<span id="cb8-12"><a href="#cb8-12" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb8-13"><a href="#cb8-13" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb8-14"><a href="#cb8-14" aria-hidden="true" tabindex="-1"></a>value_left <span class="op">=</span> Constant(domain, <span class="fl">1.0</span>)</span> +<span id="cb8-15"><a href="#cb8-15" aria-hidden="true" tabindex="-1"></a><span class="co">""" value on the left boundary """</span></span> +<span id="cb8-16"><a href="#cb8-16" aria-hidden="true" tabindex="-1"></a>bc_left <span class="op">=</span> dirichletbc(value_left, dofs_on_left_boundary, V_h)</span> +<span id="cb8-17"><a href="#cb8-17" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb8-18"><a href="#cb8-18" aria-hidden="true" tabindex="-1"></a>facets_on_right_boundary <span class="op">=</span> locate_entities_boundary(</span> +<span id="cb8-19"><a href="#cb8-19" aria-hidden="true" tabindex="-1"></a> domain, facet_geometrical_dimension, right_boundary_marker</span> +<span id="cb8-20"><a href="#cb8-20" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb8-21"><a href="#cb8-21" aria-hidden="true" tabindex="-1"></a>dofs_on_right_boundary <span class="op">=</span> locate_dofs_topological(</span> +<span id="cb8-22"><a href="#cb8-22" aria-hidden="true" tabindex="-1"></a> V_h, facet_geometrical_dimension, facets_on_right_boundary</span> +<span id="cb8-23"><a href="#cb8-23" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb8-24"><a href="#cb8-24" aria-hidden="true" tabindex="-1"></a>value_right <span class="op">=</span> Constant(domain, <span class="fl">0.0</span>)</span> +<span id="cb8-25"><a href="#cb8-25" aria-hidden="true" tabindex="-1"></a><span class="co">""" value on the right boundary """</span></span> +<span id="cb8-26"><a href="#cb8-26" aria-hidden="true" tabindex="-1"></a>bc_right <span class="op">=</span> dirichletbc(value_right, dofs_on_right_boundary, V_h)</span> +<span id="cb8-27"><a href="#cb8-27" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb8-28"><a href="#cb8-28" aria-hidden="true" tabindex="-1"></a>dirichlet_boundary_conditions <span class="op">=</span> [bc_left, bc_right]</span> +<span id="cb8-29"><a href="#cb8-29" aria-hidden="true" tabindex="-1"></a><span class="co">""" list of Dirichlet boundary conditions """</span></span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-display"> +<pre><code>' list of Dirichlet boundary conditions '</code></pre> +</div> +</div> +</section> +<section id="assemble-and-solve-the-linear-system" class="level2"> +<h2 class="anchored" data-anchor-id="assemble-and-solve-the-linear-system">Assemble and solve the linear system</h2> +<p>We start by creating a discrete function to store our solution vector. The function lives in the same approximation space as our trial function <span class="math inline">\(u_h\)</span> and is initialized to zero:</p> +<div id="fb6042bc" class="cell" data-execution_count="8"> +<div class="sourceCode cell-code" id="cb10"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a>discrete_solution <span class="op">=</span> Function(V_h)</span> +<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="co">""" discrete solution, a function in the finite element space. Our solution vector will be stored here """</span></span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-display"> +<pre><code>' discrete solution, a function in the finite element space. Our solution vector will be stored here '</code></pre> +</div> +</div> +<p>Then, we create a writer for the VTK file to store our results on disk.</p> +<div id="529bcf95" class="cell" data-execution_count="9"> +<div class="sourceCode cell-code" id="cb12"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> pathlib <span class="im">import</span> Path</span> +<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.io <span class="im">import</span> VTXWriter</span> +<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb12-4"><a href="#cb12-4" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> pathlib <span class="im">import</span> Path</span> +<span id="cb12-5"><a href="#cb12-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb12-6"><a href="#cb12-6" aria-hidden="true" tabindex="-1"></a>out_folder_path <span class="op">=</span> Path(<span class="st">"out_tutorial"</span>)</span> +<span id="cb12-7"><a href="#cb12-7" aria-hidden="true" tabindex="-1"></a>out_folder_path.mkdir(exist_ok<span class="op">=</span><span class="va">True</span>, parents<span class="op">=</span><span class="va">True</span>)</span> +<span id="cb12-8"><a href="#cb12-8" aria-hidden="true" tabindex="-1"></a>vtx_writer <span class="op">=</span> VTXWriter(</span> +<span id="cb12-9"><a href="#cb12-9" aria-hidden="true" tabindex="-1"></a> domain.comm, out_folder_path <span class="op">/</span> <span class="st">"poisson_solution.bp"</span>, discrete_solution, engine<span class="op">=</span><span class="st">"BP4"</span></span> +<span id="cb12-10"><a href="#cb12-10" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb12-11"><a href="#cb12-11" aria-hidden="true" tabindex="-1"></a>vtx_writer.write(t<span class="op">=</span><span class="fl">0.0</span>)</span> +<span id="cb12-12"><a href="#cb12-12" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb12-13"><a href="#cb12-13" aria-hidden="true" tabindex="-1"></a>vtk_file_abs_path_name <span class="op">=</span> <span class="bu">str</span>(out_folder_path.resolve()) <span class="op">+</span> <span class="st">"/poisson_solution.bp"</span></span> +<span id="cb12-14"><a href="#cb12-14" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="st">"Writing solution to file "</span> <span class="op">+</span> vtk_file_abs_path_name)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-stdout"> +<pre><code>Writing solution to file /root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp</code></pre> +</div> +</div> +</section> +<section id="this-is-where-the-magic-happens" class="level2"> +<h2 class="anchored" data-anchor-id="this-is-where-the-magic-happens">This is where the magic happens</h2> +<p>We now reap the true benefit of modern FEM backends: we can assemble the linear system and solve it in a single line of code.</p> +<div id="06034319" class="cell" data-execution_count="10"> +<div class="sourceCode cell-code" id="cb14"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.fem.petsc <span class="im">import</span> LinearProblem</span> +<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a>linear_solver_options <span class="op">=</span> {<span class="st">"ksp_type"</span>: <span class="st">"preonly"</span>, <span class="st">"pc_type"</span>: <span class="st">"lu"</span>}</span> +<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a>problem <span class="op">=</span> LinearProblem(</span> +<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a> weak_form_lhs,</span> +<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a> weak_form_rhs,</span> +<span id="cb14-8"><a href="#cb14-8" aria-hidden="true" tabindex="-1"></a> bcs<span class="op">=</span>dirichlet_boundary_conditions,</span> +<span id="cb14-9"><a href="#cb14-9" aria-hidden="true" tabindex="-1"></a> petsc_options<span class="op">=</span> linear_solver_options,</span> +<span id="cb14-10"><a href="#cb14-10" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb14-11"><a href="#cb14-11" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb14-12"><a href="#cb14-12" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb14-13"><a href="#cb14-13" aria-hidden="true" tabindex="-1"></a>discrete_solution <span class="op">=</span> problem.solve()</span> +<span id="cb14-14"><a href="#cb14-14" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb14-15"><a href="#cb14-15" aria-hidden="true" tabindex="-1"></a><span class="co"># Write the solution to disk</span></span> +<span id="cb14-16"><a href="#cb14-16" aria-hidden="true" tabindex="-1"></a>vtx_writer.write(t<span class="op">=</span><span class="fl">1.0</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +</div> +<p>Ok… something happened … I guess? Let’s see if we can visualize the solution.</p> +</section> +<section id="visualization" class="level2"> +<h2 class="anchored" data-anchor-id="visualization">Visualization</h2> +<p>There are different ways to visualize the solution. For a check of the solution from within our python script, we can visualize the solution using <code>pyvista</code>.</p> +<p>The result is not super pretty but we can check that the solution indeed “looks” like a linear connection between the boundary conditions</p> +<div id="1430c77b" class="cell" data-execution_count="11"> +<div class="sourceCode cell-code" id="cb15"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> has_visualization:</span> +<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a> cells, types, x <span class="op">=</span> dolfinx.plot.vtk_mesh(V_h)</span> +<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a> grid <span class="op">=</span> pyvista.UnstructuredGrid(cells, types, x)</span> +<span id="cb15-4"><a href="#cb15-4" aria-hidden="true" tabindex="-1"></a> plotter <span class="op">=</span> pyvista.Plotter()</span> +<span id="cb15-5"><a href="#cb15-5" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb15-6"><a href="#cb15-6" aria-hidden="true" tabindex="-1"></a> plotter.add_mesh(grid, scalars<span class="op">=</span>discrete_solution.x.array, show_edges<span class="op">=</span><span class="va">True</span>, cmap<span class="op">=</span><span class="st">"coolwarm"</span>)</span> +<span id="cb15-7"><a href="#cb15-7" aria-hidden="true" tabindex="-1"></a> plotter.add_title(<span class="ss">f"solution"</span>)</span> +<span id="cb15-8"><a href="#cb15-8" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb15-9"><a href="#cb15-9" aria-hidden="true" tabindex="-1"></a> <span class="co"># add axes labels for x and y axes</span></span> +<span id="cb15-10"><a href="#cb15-10" aria-hidden="true" tabindex="-1"></a> plotter.show_bounds(</span> +<span id="cb15-11"><a href="#cb15-11" aria-hidden="true" tabindex="-1"></a> grid<span class="op">=</span><span class="va">None</span>,</span> +<span id="cb15-12"><a href="#cb15-12" aria-hidden="true" tabindex="-1"></a> location<span class="op">=</span><span class="st">"outer"</span>,</span> +<span id="cb15-13"><a href="#cb15-13" aria-hidden="true" tabindex="-1"></a> all_edges<span class="op">=</span><span class="va">True</span>,</span> +<span id="cb15-14"><a href="#cb15-14" aria-hidden="true" tabindex="-1"></a> )</span> +<span id="cb15-15"><a href="#cb15-15" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb15-16"><a href="#cb15-16" aria-hidden="true" tabindex="-1"></a> plotter.view_xy()</span> +<span id="cb15-17"><a href="#cb15-17" aria-hidden="true" tabindex="-1"></a> plotter.show()</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-display"> +<div> +<figure class="figure"> +<p><img src="intro.out_files/figure-html/cell-12-output-1.png" class="img-fluid figure-img"></p> +</figure> +</div> +</div> +</div> +</section> +<section id="post-processing-with-paraview" class="level2"> +<h2 class="anchored" data-anchor-id="post-processing-with-paraview">Post-processing with Paraview</h2> +<p>We can also visualize the solution using Paraview. To do that, we open the files written to the following location</p> +<div id="d277e7ca" class="cell" data-execution_count="12"> +<div class="sourceCode cell-code" id="cb16"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(vtk_file_abs_path_name)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-stdout"> +<pre><code>/root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp</code></pre> +</div> +</div> +</section> +<section id="verification-comparing-with-the-exact-solution" class="level2"> +<h2 class="anchored" data-anchor-id="verification-comparing-with-the-exact-solution"><em>Verification</em>: Comparing with the exact solution</h2> +<p>For the simple 1D Poisson equation, we can easily compare with the analytical solution, which is just a linear connection of the boundary values, e.g.</p> +<p><span class="math display">\[ +u_{\text{exact}}(x,y) = 1 - x \quad \text{ for } x \in [0,1], y \in [0,1] +\]</span></p> +<div id="1ae66bfb" class="cell" data-execution_count="13"> +<div class="sourceCode cell-code" id="cb18"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> dolfinx.fem <span class="im">import</span> assemble_scalar, form</span> +<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> petsc4py <span class="im">import</span> PETSc</span> +<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> u_exact(x):</span> +<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a> values <span class="op">=</span> np.zeros((<span class="dv">1</span> , x.shape[<span class="dv">1</span>]), dtype<span class="op">=</span>PETSc.ScalarType)</span> +<span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a> values[<span class="dv">0</span>] <span class="op">=</span> <span class="fl">1.0</span> <span class="op">-</span> x[<span class="dv">0</span>]</span> +<span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> values</span> +<span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb18-9"><a href="#cb18-9" aria-hidden="true" tabindex="-1"></a>u_ex <span class="op">=</span> Function(V_h)</span> +<span id="cb18-10"><a href="#cb18-10" aria-hidden="true" tabindex="-1"></a>u_ex.interpolate(u_exact)</span> +<span id="cb18-11"><a href="#cb18-11" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb18-12"><a href="#cb18-12" aria-hidden="true" tabindex="-1"></a>L2_error <span class="op">=</span> form(dot(discrete_solution <span class="op">-</span> u_ex, discrete_solution <span class="op">-</span> u_ex) <span class="op">*</span> dx)</span> +<span id="cb18-13"><a href="#cb18-13" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb18-14"><a href="#cb18-14" aria-hidden="true" tabindex="-1"></a>error_L2 <span class="op">=</span> np.sqrt(domain.comm.allreduce(assemble_scalar(L2_error), op<span class="op">=</span>MPI.SUM))</span> +<span id="cb18-15"><a href="#cb18-15" aria-hidden="true" tabindex="-1"></a>error_max <span class="op">=</span> domain.comm.allreduce(</span> +<span id="cb18-16"><a href="#cb18-16" aria-hidden="true" tabindex="-1"></a> np.<span class="bu">max</span>(discrete_solution.x.petsc_vec.array <span class="op">-</span> u_ex.x.petsc_vec.array), op<span class="op">=</span>MPI.MAX</span> +<span id="cb18-17"><a href="#cb18-17" aria-hidden="true" tabindex="-1"></a>)</span> +<span id="cb18-18"><a href="#cb18-18" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb18-19"><a href="#cb18-19" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="st">"L2 error with respect to the analytical solution: "</span> <span class="op">+</span> <span class="bu">str</span>(error_L2))</span> +<span id="cb18-20"><a href="#cb18-20" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="st">"Maximum error at the degrees of freedom: "</span> <span class="op">+</span> <span class="bu">str</span>(error_max))</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> +<div class="cell-output cell-output-stdout"> +<pre><code>L2 error with respect to the analytical solution: 1.2378947445213391e-16 +Maximum error at the degrees of freedom: 3.3306690738754696e-16</code></pre> +</div> +</div> + + +</section> + +</main> <!-- /main --> +<script id="quarto-html-after-body" type="application/javascript"> +window.document.addEventListener("DOMContentLoaded", function (event) { + const toggleBodyColorMode = (bsSheetEl) => { + const mode = bsSheetEl.getAttribute("data-mode"); + const bodyEl = window.document.querySelector("body"); + if (mode === "dark") { + bodyEl.classList.add("quarto-dark"); + bodyEl.classList.remove("quarto-light"); + } else { + bodyEl.classList.add("quarto-light"); + bodyEl.classList.remove("quarto-dark"); + } + } + const toggleBodyColorPrimary = () => { + const bsSheetEl = window.document.querySelector("link#quarto-bootstrap"); + if (bsSheetEl) { + toggleBodyColorMode(bsSheetEl); + } + } + toggleBodyColorPrimary(); + const icon = ""; + const anchorJS = new window.AnchorJS(); + anchorJS.options = { + placement: 'right', + icon: icon + }; + anchorJS.add('.anchored'); + const isCodeAnnotation = (el) => { + for (const clz of el.classList) { + if (clz.startsWith('code-annotation-')) { + return true; + } + } + return false; + } + const onCopySuccess = function(e) { + // button target + const button = e.trigger; + // don't keep focus + button.blur(); + // flash "checked" + button.classList.add('code-copy-button-checked'); + var currentTitle = button.getAttribute("title"); + button.setAttribute("title", "Copied!"); + let tooltip; + if (window.bootstrap) { + button.setAttribute("data-bs-toggle", "tooltip"); + button.setAttribute("data-bs-placement", "left"); + button.setAttribute("data-bs-title", "Copied!"); + tooltip = new bootstrap.Tooltip(button, + { trigger: "manual", + customClass: "code-copy-button-tooltip", + offset: [0, -8]}); + tooltip.show(); + } + setTimeout(function() { + if (tooltip) { + tooltip.hide(); + button.removeAttribute("data-bs-title"); + button.removeAttribute("data-bs-toggle"); + button.removeAttribute("data-bs-placement"); + } + button.setAttribute("title", currentTitle); + button.classList.remove('code-copy-button-checked'); + }, 1000); + // clear code selection + e.clearSelection(); + } + const getTextToCopy = function(trigger) { + const codeEl = trigger.previousElementSibling.cloneNode(true); + for (const childEl of codeEl.children) { + if (isCodeAnnotation(childEl)) { + childEl.remove(); + } + } + return codeEl.innerText; + } + const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { + text: getTextToCopy + }); + clipboard.on('success', onCopySuccess); + if (window.document.getElementById('quarto-embedded-source-code-modal')) { + const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { + text: getTextToCopy, + container: window.document.getElementById('quarto-embedded-source-code-modal') + }); + clipboardModal.on('success', onCopySuccess); + } + var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); + var mailtoRegex = new RegExp(/^mailto:/); + var filterRegex = new RegExp('/' + window.location.host + '/'); + var isInternal = (href) => { + return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); + } + // Inspect non-navigation links and adorn them if external + var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)'); + for (var i=0; i<links.length; i++) { + const link = links[i]; + if (!isInternal(link.href)) { + // undo the damage that might have been done by quarto-nav.js in the case of + // links that we want to consider external + if (link.dataset.originalHref !== undefined) { + link.href = link.dataset.originalHref; + } + } + } + function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { + const config = { + allowHTML: true, + maxWidth: 500, + delay: 100, + arrow: false, + appendTo: function(el) { + return el.parentElement; + }, + interactive: true, + interactiveBorder: 10, + theme: 'quarto', + placement: 'bottom-start', + }; + if (contentFn) { + config.content = contentFn; + } + if (onTriggerFn) { + config.onTrigger = onTriggerFn; + } + if (onUntriggerFn) { + config.onUntrigger = onUntriggerFn; + } + window.tippy(el, config); + } + const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); + for (var i=0; i<noterefs.length; i++) { + const ref = noterefs[i]; + tippyHover(ref, function() { + // use id or data attribute instead here + let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); + try { href = new URL(href).hash; } catch {} + const id = href.replace(/^#\/?/, ""); + const note = window.document.getElementById(id); + if (note) { + return note.innerHTML; + } else { + return ""; + } + }); + } + const xrefs = window.document.querySelectorAll('a.quarto-xref'); + const processXRef = (id, note) => { + // Strip column container classes + const stripColumnClz = (el) => { + el.classList.remove("page-full", "page-columns"); + if (el.children) { + for (const child of el.children) { + stripColumnClz(child); + } + } + } + stripColumnClz(note) + if (id === null || id.startsWith('sec-')) { + // Special case sections, only their first couple elements + const container = document.createElement("div"); + if (note.children && note.children.length > 2) { + container.appendChild(note.children[0].cloneNode(true)); + for (let i = 1; i < note.children.length; i++) { + const child = note.children[i]; + if (child.tagName === "P" && child.innerText === "") { + continue; + } else { + container.appendChild(child.cloneNode(true)); + break; + } + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(container); + } + return container.innerHTML + } else { + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + return note.innerHTML; + } + } else { + // Remove any anchor links if they are present + const anchorLink = note.querySelector('a.anchorjs-link'); + if (anchorLink) { + anchorLink.remove(); + } + if (window.Quarto?.typesetMath) { + window.Quarto.typesetMath(note); + } + if (note.classList.contains("callout")) { + return note.outerHTML; + } else { + return note.innerHTML; + } + } + } + for (var i=0; i<xrefs.length; i++) { + const xref = xrefs[i]; + tippyHover(xref, undefined, function(instance) { + instance.disable(); + let url = xref.getAttribute('href'); + let hash = undefined; + if (url.startsWith('#')) { + hash = url; + } else { + try { hash = new URL(url).hash; } catch {} + } + if (hash) { + const id = hash.replace(/^#\/?/, ""); + const note = window.document.getElementById(id); + if (note !== null) { + try { + const html = processXRef(id, note.cloneNode(true)); + instance.setContent(html); + } finally { + instance.enable(); + instance.show(); + } + } else { + // See if we can fetch this + fetch(url.split('#')[0]) + .then(res => res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.getElementById(id); + if (note !== null) { + const html = processXRef(id, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + } else { + // See if we can fetch a full url (with no hash to target) + // This is a special case and we should probably do some content thinning / targeting + fetch(url) + .then(res => res.text()) + .then(html => { + const parser = new DOMParser(); + const htmlDoc = parser.parseFromString(html, "text/html"); + const note = htmlDoc.querySelector('main.content'); + if (note !== null) { + // This should only happen for chapter cross references + // (since there is no id in the URL) + // remove the first header + if (note.children.length > 0 && note.children[0].tagName === "HEADER") { + note.children[0].remove(); + } + const html = processXRef(null, note); + instance.setContent(html); + } + }).finally(() => { + instance.enable(); + instance.show(); + }); + } + }, function(instance) { + }); + } + let selectedAnnoteEl; + const selectorForAnnotation = ( cell, annotation) => { + let cellAttr = 'data-code-cell="' + cell + '"'; + let lineAttr = 'data-code-annotation="' + annotation + '"'; + const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; + return selector; + } + const selectCodeLines = (annoteEl) => { + const doc = window.document; + const targetCell = annoteEl.getAttribute("data-target-cell"); + const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); + const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); + const lines = annoteSpan.getAttribute("data-code-lines").split(","); + const lineIds = lines.map((line) => { + return targetCell + "-" + line; + }) + let top = null; + let height = null; + let parent = null; + if (lineIds.length > 0) { + //compute the position of the single el (top and bottom and make a div) + const el = window.document.getElementById(lineIds[0]); + top = el.offsetTop; + height = el.offsetHeight; + parent = el.parentElement.parentElement; + if (lineIds.length > 1) { + const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); + const bottom = lastEl.offsetTop + lastEl.offsetHeight; + height = bottom - top; + } + if (top !== null && height !== null && parent !== null) { + // cook up a div (if necessary) and position it + let div = window.document.getElementById("code-annotation-line-highlight"); + if (div === null) { + div = window.document.createElement("div"); + div.setAttribute("id", "code-annotation-line-highlight"); + div.style.position = 'absolute'; + parent.appendChild(div); + } + div.style.top = top - 2 + "px"; + div.style.height = height + 4 + "px"; + div.style.left = 0; + let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); + if (gutterDiv === null) { + gutterDiv = window.document.createElement("div"); + gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); + gutterDiv.style.position = 'absolute'; + const codeCell = window.document.getElementById(targetCell); + const gutter = codeCell.querySelector('.code-annotation-gutter'); + gutter.appendChild(gutterDiv); + } + gutterDiv.style.top = top - 2 + "px"; + gutterDiv.style.height = height + 4 + "px"; + } + selectedAnnoteEl = annoteEl; + } + }; + const unselectCodeLines = () => { + const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; + elementsIds.forEach((elId) => { + const div = window.document.getElementById(elId); + if (div) { + div.remove(); + } + }); + selectedAnnoteEl = undefined; + }; + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + if (selectedAnnoteEl) { + selectCodeLines(selectedAnnoteEl); + } + }, 10) + ); + function throttle(fn, ms) { + let throttle = false; + let timer; + return (...args) => { + if(!throttle) { // first call gets through + fn.apply(this, args); + throttle = true; + } else { // all the others get throttled + if(timer) clearTimeout(timer); // cancel #2 + timer = setTimeout(() => { + fn.apply(this, args); + timer = throttle = false; + }, ms); + } + }; + } + // Attach click handler to the DT + const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); + for (const annoteDlNode of annoteDls) { + annoteDlNode.addEventListener('click', (event) => { + const clickedEl = event.target; + if (clickedEl !== selectedAnnoteEl) { + unselectCodeLines(); + const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); + if (activeEl) { + activeEl.classList.remove('code-annotation-active'); + } + selectCodeLines(clickedEl); + clickedEl.classList.add('code-annotation-active'); + } else { + // Unselect the line + unselectCodeLines(); + clickedEl.classList.remove('code-annotation-active'); + } + }); + } + const findCites = (el) => { + const parentEl = el.parentElement; + if (parentEl) { + const cites = parentEl.dataset.cites; + if (cites) { + return { + el, + cites: cites.split(' ') + }; + } else { + return findCites(el.parentElement) + } + } else { + return undefined; + } + }; + var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); + for (var i=0; i<bibliorefs.length; i++) { + const ref = bibliorefs[i]; + const citeInfo = findCites(ref); + if (citeInfo) { + tippyHover(citeInfo.el, function() { + var popup = window.document.createElement('div'); + citeInfo.cites.forEach(function(cite) { + var citeDiv = window.document.createElement('div'); + citeDiv.classList.add('hanging-indent'); + citeDiv.classList.add('csl-entry'); + var biblioDiv = window.document.getElementById('ref-' + cite); + if (biblioDiv) { + citeDiv.innerHTML = biblioDiv.innerHTML; + } + popup.appendChild(citeDiv); + }); + return popup.innerHTML; + }); + } + } +}); +</script> +</div> <!-- /content --> + + + + +<footer class="footer"><div class="nav-footer"><div class="nav-footer-center"><div class="toc-actions d-sm-block d-md-none"><ul><li><a href="https://git.rwth-aachen.de/mbd/courses/cmm/issues/new" class="toc-action"><i class="bi bi-git"></i>Report an issue</a></li></ul></div></div></div></footer></body></html> \ No newline at end of file diff --git a/public/public-lecturer/content/exercises/intro.out_files/figure-html/cell-12-output-1.png b/public/public-lecturer/content/exercises/intro.out_files/figure-html/cell-12-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7986910ed1b3490a28e37fc5464a2263cce5af41 Binary files /dev/null and b/public/public-lecturer/content/exercises/intro.out_files/figure-html/cell-12-output-1.png differ diff --git a/public/public-lecturer/content/exercises/intro.out_files/figure-html/cell-5-output-1.png b/public/public-lecturer/content/exercises/intro.out_files/figure-html/cell-5-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1b291dadc4b18588d4d9b627fb5fc241fa15ef Binary files /dev/null and b/public/public-lecturer/content/exercises/intro.out_files/figure-html/cell-5-output-1.png differ diff --git a/public/search.json b/public/search.json index c237013cf388814cdb33e2011f52c04d06ad3c7b..8651783ad209337a8b7fcce9db56a79548804099 100644 --- a/public/search.json +++ b/public/search.json @@ -1,658 +1,907 @@ [ { - "objectID": "public-lecturer/content/exercises/homework_template.html", - "href": "public-lecturer/content/exercises/homework_template.html", - "title": "Task A: import a full problem", + "objectID": "public-lecturer/content/exercises/intro.out.html", + "href": "public-lecturer/content/exercises/intro.out.html", + "title": "", "section": "", - "text": "****Submission Deadline: 30.04.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "text": "This notebook gives a small introduction to FenicsX, an open-source FEM library. We use the Python API of FenicsX to solve an example PDE problem." }, { - "objectID": "public-lecturer/content/exercises/homework_template.html#tasks", - "href": "public-lecturer/content/exercises/homework_template.html#tasks", - "title": "Task A: import a full problem", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" + "objectID": "public-lecturer/content/exercises/intro.out.html#learning-goals", + "href": "public-lecturer/content/exercises/intro.out.html#learning-goals", + "title": "", + "section": "Learning goals", + "text": "Learning goals\n\nUnderstand the basic structure of a FenicsX program\nLearn the basic building blocks of modern FEM software: mesh, function space, boundary conditions, weak form, and solvers" }, { - "objectID": "public-lecturer/content/exercises/homework05.html", - "href": "public-lecturer/content/exercises/homework05.html", - "title": "Galilean invariance", - "section": "", - "text": "****Submission Deadline: 09.07.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "objectID": "public-lecturer/content/exercises/intro.out.html#poisson-model", + "href": "public-lecturer/content/exercises/intro.out.html#poisson-model", + "title": "", + "section": "Poisson model", + "text": "Poisson model\nIn this example, we solve the classical Poisson equation for a scalar \\(u\\),\n\\[\n-\\Delta u = f \\text{ in } \\Omega = \\left[0, \\,1\\right] \\times \\left[0,\\,1\\right], \\quad u = g \\text{ on } \\partial\\Omega \\quad ,\n\\]\nwhere \\(\\Omega\\) is the domain of interest, \\(f\\) is a given scalar source term, and \\(g\\) is a Dirichlet boundary condition." }, { - "objectID": "public-lecturer/content/exercises/homework05.html#tasks", - "href": "public-lecturer/content/exercises/homework05.html#tasks", - "title": "Galilean invariance", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that the SWE with velocity profile correction are not Galilean invariant.\n\n\nTask 2\nIf we assume plug-flow \\((\\alpha=1)\\), show that the SWE are Galilean invariant." + "objectID": "public-lecturer/content/exercises/intro.out.html#structure", + "href": "public-lecturer/content/exercises/intro.out.html#structure", + "title": "", + "section": "Structure", + "text": "Structure\nBelow, we learn how to\n\ncreate a mesh for a simple domain\npick discrete FEM function spaces (which functions do we use to approximate the PDE solution?)\ndefine the weak form of the PDE\napply boundary conditions\nassemble and solve the linear system resulting from the discretization\nvisualize the solution" }, { - "objectID": "public-lecturer/content/exercises/homework05.html#tasks-1", - "href": "public-lecturer/content/exercises/homework05.html#tasks-1", - "title": "Galilean invariance", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nWhat does \\(\\alpha\\) stand for and how can it be computed? Determine \\(\\alpha\\) for a linear velocity profile with \\(u(y=0) = 0\\) and \\(u(y=h) = u_s\\).\n\n\nTask 2\nAssume a shallow lake, currently at rest. That means \\(h=H\\) and \\(u=0\\). A stone is thrown into the lake and causes a small surface perturbation in height and velocity, denoted by \\(h_1\\) and \\(u_1\\). Derive a of equations for \\(h_1\\) and \\(u_1\\) by means of linearization\n\nTip\nThe linearization can be performed by looking at small perturbations from a ground state \\((h_0, u_0)\\), e.g. by defining: \\(h(x,t) = h_0(x, t) + \\delta \\, h_1(x,t) + \\mathcal{O}( \\delta^2 )\\) and \\(u(x,t) = u_0(x, t) + \\delta \\, u_1(x,t) + \\mathcal{O}( \\delta^2 )\\), where \\(\\delta\\) denotes the small amplitude of the perturbation.\n\n\n\nTask 3\nReduce the system derived in Task 2 to an equation for \\(h_1\\). What type of equation do we find?\n\n\nTask 4\nThe wave ansatz is given by \\(h_1(x,t) = A \\, e^{i (k \\, x - \\omega \\, t)}\\). State what \\(A\\), \\(i\\), \\(k\\) and \\(\\omega\\) stand for? Using the wave ansatz, compute the phase velocity.\n\n\nTask 5\nAssume that we wait \\(10s\\) until a surface perturbation caused by a stone reaches the lake’s shore. How much longer would we have to wait at a similarly sized lake on Saturn’s moon Titan? (Titan has surface lakes of liquid ethane and methane and a gravitational acceleration of \\(g=1.4 \\frac{m}{s^2}\\))" + "objectID": "public-lecturer/content/exercises/intro.out.html#lets-go", + "href": "public-lecturer/content/exercises/intro.out.html#lets-go", + "title": "", + "section": "Let’s go!", + "text": "Let’s go!\nFirst, we import some of the necessary python libraries\n\nfrom mpi4py import MPI\nimport numpy as np\nimport tqdm.autonotebook\n\ntry:\n import os\n\n username = os.getenv(\"USER\") or os.geteuid()\n\n # Set XDG_RUNTIME_DIR to a valid directory\n os.environ[\"XDG_RUNTIME_DIR\"] = f\"/tmp/runtime-{username}\"\n os.makedirs(os.environ[\"XDG_RUNTIME_DIR\"], exist_ok=True)\n os.chmod(os.environ[\"XDG_RUNTIME_DIR\"], 0o700)\nexcept Exception as e:\n print(f\"Failed to set XDG_RUNTIME_DIR: {e}\")\n print(\"You might get some warnings, but it should still work.\")\n\n/tmp/ipykernel_3316/138077527.py:3: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n import tqdm.autonotebook" }, { - "objectID": "public-lecturer/content/exercises/homework05.html#tasks-2", - "href": "public-lecturer/content/exercises/homework05.html#tasks-2", - "title": "Galilean invariance", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDerive the weak formulation of Equation 1 using the following strategy\n\nWe define a indicator function (test function)\n\n\\[\n\\phi(x, t) =\n\\begin{cases}\n 1 & \\text{ for } (x, t) \\in [x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}] \\\\\n 0 & \\text{ else }\n\\end{cases}\n\\]\n\nMultiply Equation 1 by the test function and integrate over the space-time volume \\([x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}]\\).\nWe now want to extend the integration bounds to \\((-\\inf, \\inf) \\times [0, \\inf)\\). Why can we do that?\nWe want to use the fact that we can approximate \\(\\phi\\) with another test function that is continously-differentiable with arbitrary accuracy. Let’s call this new test function \\(\\tilde{\\phi}\\). Use partial integration to derive at the weak formulation of Equation 1. Simplify the expression as much as possible.\n\n\n\nTask 2\nThe statement derived in 4. indicates that the weak-formulation also makes sense in the presence of discontinuities. Why?" + "objectID": "public-lecturer/content/exercises/intro.out.html#mesh-and-computational-domain", + "href": "public-lecturer/content/exercises/intro.out.html#mesh-and-computational-domain", + "title": "", + "section": "Mesh and computational domain", + "text": "Mesh and computational domain\nThe basis for our discretization is a discrete approximation \\(\\Omega_h\\) of the computational domain.\nHere, he have the choice between different discretization types, e.g. quadrilateral, triangular etc.\n\nfrom dolfinx import mesh\n\nnumber_elements = 5\ndomain = mesh.create_unit_square(\n MPI.COMM_WORLD, number_elements, 1, cell_type=mesh.CellType.quadrilateral\n)" }, { - "objectID": "public-lecturer/content/exercises/homework05.html#tasks-3", - "href": "public-lecturer/content/exercises/homework05.html#tasks-3", - "title": "Galilean invariance", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that Equation 2 is equivalent to Equation 3:\n\\[\n\\mathbf{f}_{i+1/2}^{Roe} = \\frac{1}{2} \\left( \\mathbf{f}_l + \\mathbf{f}_r \\right) - \\frac{1}{2} \\Big| \\bar{\\mathbf{A}}(\\tilde{\\mathbf{Q}}) \\Big| \\cdot \\left( \\mathbf{Q}_R - \\mathbf{Q}_L \\right)\n\\qquad(3)\\]\nwhere \\(\\big| \\mathbf{A} \\big| = \\mathbf{R} \\Big| \\mathbf{\\Lambda} \\Big| \\mathbf{R}^{-1}\\) for a given eigen-decomposition \\(\\mathbf{A} = \\mathbf{R} \\mathbf{\\Lambda} \\mathbf{R}^{-1}\\)." + "objectID": "public-lecturer/content/exercises/intro.out.html#the-variational-problem", + "href": "public-lecturer/content/exercises/intro.out.html#the-variational-problem", + "title": "", + "section": "The variational problem", + "text": "The variational problem\nA key step in building finite element methods is the weak form of the PDE, upon which the discrete variational problem is based.\nIn all cases, the weak form is obtained by multiplying the PDE with a test function \\(v\\) and integrating over the domain \\(\\Omega\\).\nFurther operations on the resulting integral equations, such as integration by parts, can then be applied. This is often done improve the properties of the method, for example to - reduce the required regularity (we need less derivatives of the solution to exist) and hence allow for lower-order (=cheaper) finite element spaces - introduce symmetry to the (bi-)linear forms, which is favored by many linear solvers - introduce certain natural boundary conditions, e.g. the terms that appear as boundary integrals in the weak form\nA first key realization is that the weak form for a given PDE is not unique." }, { - "objectID": "public-lecturer/content/exercises/homework03.html", - "href": "public-lecturer/content/exercises/homework03.html", - "title": "Hooke’s Law", - "section": "", - "text": "****Submission Deadline: 04.06.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "objectID": "public-lecturer/content/exercises/intro.out.html#a-weak-form-for-the-poisson-equation", + "href": "public-lecturer/content/exercises/intro.out.html#a-weak-form-for-the-poisson-equation", + "title": "", + "section": "A weak form for the Poisson equation", + "text": "A weak form for the Poisson equation\nA typical variational problem for the Poisson equation is given by\nFind \\(u \\in V\\) such that \\[\n\\int_\\Omega \\nabla u_h \\cdot \\nabla v_h \\, dx - \\cancel{\\int_{\\partial\\Omega} \\mathbf{\\nabla} u_h \\cdot \\mathbf{n} \\, v_h \\, ds} = \\int_\\Omega f v_h \\, dx\n\\] for all \\(v \\in V_{0}\\). Here \\(\\mathbf{n}\\) is the outward normal vector on the boundary \\(\\partial\\Omega\\) and \\(V_{0}\\) is the space of functions that vanish on the boundary, hence the boundary integral vanishes.\nThe discrete variational problem is obtained by replacing the continous domain \\(\\Omega\\) with its discrete approximation \\(\\Omega_h\\) (our mesh) and the continuous trial and test spaces \\(V\\) and \\(V_{0}\\) with the discrete finite element spaces \\(V_h\\) and \\(V_{h,0}\\), respectively.\nTechnical note: By default, FenicsX test functions are zero on parts of the boundary where Dirichlet conditions are applied. Since we only use Dirichlet condiitons in this example, we don’t have to worry about the boundary integral term and we omit the \\(V_{h,0}\\) notation." }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks", - "href": "public-lecturer/content/exercises/homework03.html#tasks", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nUsing Hooke’s law, calculate the stretch in a new 6 m long steel (Young’s Modulus \\(E= 20 \\times 10^{10} \\text{Pa}\\)) pipe that supports a \\(100 \\text{kg}\\) drill bit and a \\(3 \\text{km}\\) long pipe with a linear mass density of \\(20 \\text{kg} \\text{m}^{-1}\\). Treat the pipe as a solid cylinder with a \\(5 \\text{cm}\\) diameter.\n\n\nTask 2\nAssuming a Poisson’s ratio \\(\\nu = \\dfrac{1}{3}\\), what is the corresponding cross-sectional thinning?\n\n\nTask 3\nCalculate the bulk modulus and the Lame constants for the steel pipe.\n\n\nTask 4\nUsing the Voigt notation, calculate the Stiffness Matrix for the case of Linear Elasticity using the Lame’s constants." + "objectID": "public-lecturer/content/exercises/intro.out.html#our-first-finite-element", + "href": "public-lecturer/content/exercises/intro.out.html#our-first-finite-element", + "title": "", + "section": "Our first finite element", + "text": "Our first finite element\nThe term “finite element” refers to the basis functions defined on our mesh. The idea of the finite element method is to find the best approximation of the solution \\(u\\) in a finite-dimensional function space \\(V_h\\).\nWe thus have to pick a finite element function space \\(V_h\\) on our mesh.\nTypically, the choice of the function space is crucial for the accuracy and convergence of the method (lego block analogy)\nLet’s start with a simple linear polynomial function space on the quadrilateral mesh that we created (check out what it looks like here)\n\n# used for plotting\nfrom dolfinx.fem import functionspace, Function, Constant, form\nfrom basix.ufl import element\n\n\nmesh_element_name = domain.topology.cell_name() \n\"\"\" type of mesh element, e.g. \"quadrilateral\" \"\"\"\nbasis_functions_degree = 1\n\"\"\" degree of the finite basis functions \"\"\"\n\nfinite_element = element(\n family=\"CG\", cell=domain.topology.cell_name(), degree=basis_functions_degree\n)\ndiscrete_fem_space = functionspace(mesh=domain, element=finite_element)\n\nLets have a look at our beautiful mesh:\n\ntry:\n shell = get_ipython().__class__.__name__\n has_visualization = True \nexcept NameError:\n has_visualization = False\n\nif has_visualization:\n import pyvista\n import dolfinx\n\n # Set the default window size globally\n pyvista.global_theme.window_size = (600, 600) # Adjust width and height as needed\n\n pyvista.set_jupyter_backend(\"static\")\n pyvista.start_xvfb()\n\n # Extract topology from mesh and create pyvista mesh\n topology, cell_types, x = dolfinx.plot.vtk_mesh(discrete_fem_space)\n grid = pyvista.UnstructuredGrid(topology, cell_types, x)\n\n plotter = pyvista.Plotter()\n plotter.add_title(f\"Mesh with {number_elements} elements\")\n plotter.add_mesh(grid, show_edges=True)\n plotter.camera_position = \"xy\"\n\n if not pyvista.OFF_SCREEN:\n plotter.show()\n else:\n plotter.screenshot(\"mesh.png\")" }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks-1", - "href": "public-lecturer/content/exercises/homework03.html#tasks-1", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDecompose the deformation gradient and identify the dilation, rotation and stretch.\n\n\nTask 2\nDetermine about which co-ordinate axis rotation takes place. By what angle is the sample rotated?" + "objectID": "public-lecturer/content/exercises/intro.out.html#from-math-to-code-the-weak-form-and-ufl", + "href": "public-lecturer/content/exercises/intro.out.html#from-math-to-code-the-weak-form-and-ufl", + "title": "", + "section": "From Math to Code: the weak form and UFL", + "text": "From Math to Code: the weak form and UFL\nThe main advantage of software like FenicsX is that it provides a way to work in a syntax that is very close to the mathematical notation of the weak form. The underlying syntax is called UFL (Unified Form Language) and is a domain-specific language for finite element variational forms.\nLet’s see how we can write the weak form in UFL.\n\nfrom ufl import TestFunction, TrialFunction, dot, ds, dx, grad\n\nV_h = discrete_fem_space\n\"\"\" Discrete finite element space \"\"\"\n\nu_h = TrialFunction(V_h)\n\"\"\" discrete trial function \"\"\"\nv_h = TestFunction(V_h)\n\"\"\" discrete test function \"\"\"\n\nf = Constant(domain, 0.0)\n\"\"\" right-hand side source term \"\"\"\n\n# Define the weak form lhs == rhs\nweak_form_lhs = dot(grad(u_h), grad(v_h)) * dx\nweak_form_rhs = f * v_h * dx" }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks-2", - "href": "public-lecturer/content/exercises/homework03.html#tasks-2", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDraw a sketch of the experiment. Write down the stress and strain tensor for this experiment. Does shear occur in the experiment?\n\n\nTask 2\nUsing the constitutive relation for Isotropic Linear Elasticity, calculate the elastic constants \\(\\lambda\\) and \\(\\mu\\) for this rock sample.\n\n\nTask 3\nCalculate the Young’s Modulus and Poisson’s ratio for rock material.\n\n\nTask 4\nUsing the Voigt Notation, compute the Compliance Matrix for the rock material." + "objectID": "public-lecturer/content/exercises/intro.out.html#boundary-conditions", + "href": "public-lecturer/content/exercises/intro.out.html#boundary-conditions", + "title": "", + "section": "Boundary conditions", + "text": "Boundary conditions\nThere are a couple of ways to apply boundary conditions in FenicsX. We cover the simplest way to set Dirichlet boundary conditions.\nThe basic idea is to tell FenicsX where we want to apply the Dirichlet boundary condition in terms of the mesh and then let the software figure out which nodes and facets of the mesh coincide with that geometrical location.\nWe therefore start by defining functions to tell FenicsX what we consider to be the left and right boundary of the domain (\\(x=0\\) and \\(x=1\\)).\n\n# return 1 on the left boundary of the unit square, e.g when x = (x,y)[0] close to 0\ndef left_boundary_marker(x):\n return np.isclose(x[0], 0.0)\n\n\n# return 1 on the right boundary of the unit square, e.g when x = (x,y)[0] close to 1\ndef right_boundary_marker(x):\n return np.isclose(x[0], 1.0)\n\nWe now create two boundary conditions for a constant value of \\(g=1\\) on the left boundary and \\(g=0\\) on the right boundary.\n\nfrom dolfinx.fem import dirichletbc, locate_dofs_topological\nfrom dolfinx.mesh import locate_entities_boundary\n\nmesh_topology_dim = domain.topology.dim\nfacet_geometrical_dimension = mesh_topology_dim - 1\n\nfacets_on_left_boundary = locate_entities_boundary(\n domain, facet_geometrical_dimension, left_boundary_marker\n)\ndofs_on_left_boundary = locate_dofs_topological(\n V_h, facet_geometrical_dimension, facets_on_left_boundary\n)\n\nvalue_left = Constant(domain, 1.0)\n\"\"\" value on the left boundary \"\"\"\nbc_left = dirichletbc(value_left, dofs_on_left_boundary, V_h)\n\nfacets_on_right_boundary = locate_entities_boundary(\n domain, facet_geometrical_dimension, right_boundary_marker\n)\ndofs_on_right_boundary = locate_dofs_topological(\n V_h, facet_geometrical_dimension, facets_on_right_boundary\n)\nvalue_right = Constant(domain, 0.0)\n\"\"\" value on the right boundary \"\"\"\nbc_right = dirichletbc(value_right, dofs_on_right_boundary, V_h)\n\ndirichlet_boundary_conditions = [bc_left, bc_right]\n\"\"\" list of Dirichlet boundary conditions \"\"\"\n\n' list of Dirichlet boundary conditions '" }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks-3", - "href": "public-lecturer/content/exercises/homework03.html#tasks-3", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDecide whether each of the material model is objective, and give reasons for the decision.\n\n\nTask 2\nDecide whether each of the material model is isotropic, and give reasons for the decision." + "objectID": "public-lecturer/content/exercises/intro.out.html#assemble-and-solve-the-linear-system", + "href": "public-lecturer/content/exercises/intro.out.html#assemble-and-solve-the-linear-system", + "title": "", + "section": "Assemble and solve the linear system", + "text": "Assemble and solve the linear system\nWe start by creating a discrete function to store our solution vector. The function lives in the same approximation space as our trial function \\(u_h\\) and is initialized to zero:\n\ndiscrete_solution = Function(V_h)\n\"\"\" discrete solution, a function in the finite element space. Our solution vector will be stored here \"\"\"\n\n' discrete solution, a function in the finite element space. Our solution vector will be stored here '\n\n\nThen, we create a writer for the VTK file to store our results on disk.\n\nfrom pathlib import Path\nfrom dolfinx.io import VTXWriter\n\nfrom pathlib import Path\n\nout_folder_path = Path(\"out_tutorial\")\nout_folder_path.mkdir(exist_ok=True, parents=True)\nvtx_writer = VTXWriter(\n domain.comm, out_folder_path / \"poisson_solution.bp\", discrete_solution, engine=\"BP4\"\n)\nvtx_writer.write(t=0.0)\n\nvtk_file_abs_path_name = str(out_folder_path.resolve()) + \"/poisson_solution.bp\"\nprint(\"Writing solution to file \" + vtk_file_abs_path_name)\n\nWriting solution to file /root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp" }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks-4", - "href": "public-lecturer/content/exercises/homework03.html#tasks-4", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nThe elastic limit is given for \\(\\alpha > 0\\) and \\(\\beta = 0\\). Show that Equation 1 admits solutions of type Equation 2 which are not dampened in time.\n\n\nTask 2\nThe viscous limit is given for \\(\\alpha = 0\\) and \\(\\beta > 0\\). Show that Equation 1 admits stationary solutions of type Equation 2 which are dampened exponentially in time.\n\n\nTask 3\nHow does the solution look like for the case \\(\\alpha > 0\\) and \\(\\beta > 0\\)? Differentiate the cases\n\n\\(4 \\, \\rho \\alpha > \\beta^2\\)\n\\(4 \\, \\rho \\alpha < \\beta^2\\)" + "objectID": "public-lecturer/content/exercises/intro.out.html#this-is-where-the-magic-happens", + "href": "public-lecturer/content/exercises/intro.out.html#this-is-where-the-magic-happens", + "title": "", + "section": "This is where the magic happens", + "text": "This is where the magic happens\nWe now reap the true benefit of modern FEM backends: we can assemble the linear system and solve it in a single line of code.\n\nfrom dolfinx.fem.petsc import LinearProblem\n\nlinear_solver_options = {\"ksp_type\": \"preonly\", \"pc_type\": \"lu\"}\n\nproblem = LinearProblem(\n weak_form_lhs,\n weak_form_rhs,\n bcs=dirichlet_boundary_conditions,\n petsc_options= linear_solver_options,\n)\n\n\ndiscrete_solution = problem.solve()\n\n# Write the solution to disk\nvtx_writer.write(t=1.0)\n\nOk… something happened … I guess? Let’s see if we can visualize the solution." }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks-5", - "href": "public-lecturer/content/exercises/homework03.html#tasks-5", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that Equation 3 satisfies Equation 4 if and only the condition\n\\[\nA \\, k^2 \\left( \\mu \\mathbf{n}_d + (\\mu + \\lambda) (\\mathbf{n}_d \\cdot \\mathbf{n}_p)\\mathbf{n}_p \\right) = A\\rho\\omega^2 \\mathbf{n}_d\n\\]\nis met.\n\n\nTask 2\nIn the following, we want to show that for a linear elastic, isotropic solid with \\(\\lambda + \\mu \\neq 0\\), plane waves only admit two types of solutions. The first wave type are longitudinal waves in direction \\(\\mathbf{n}_p\\) where \\(\\mathbf{n}_p \\, \\parallel \\, \\mathbf{n}_d\\). The second wave type are transverse waves where \\(\\mathbf{n}_p \\, \\bot \\, \\mathbf{n}_d\\).\nAssume \\(\\lambda + \\mu \\neq 0\\). For any given \\(\\mathbf{n}_p \\neq \\mathbf{0}\\) and \\(A, k \\neq 0\\) show that the only independent solutions \\((\\mathbf{n}_d, \\omega)\\) are:\n\\[\n\\begin{aligned}\n& \\mathbf{n}_d = \\pm \\mathbf{n}_p, \\quad \\omega^2 = k^2 (\\lambda + 2 \\mu) / \\rho, \\\\\n& \\mathbf{n}_d \\cdot \\mathbf{n}_p = 0, \\quad \\omega^2 = k^2 \\mu / \\rho.\n\\end{aligned}\n\\]\n\nTip\nYou need to identify and solve an eigenvalue problem.\n\n\n\nTask 3\nWhat happens in the case \\(\\lambda + \\mu = 0\\)." + "objectID": "public-lecturer/content/exercises/intro.out.html#visualization", + "href": "public-lecturer/content/exercises/intro.out.html#visualization", + "title": "", + "section": "Visualization", + "text": "Visualization\nThere are different ways to visualize the solution. For a check of the solution from within our python script, we can visualize the solution using pyvista.\nThe result is not super pretty but we can check that the solution indeed “looks” like a linear connection between the boundary conditions\n\nif has_visualization:\n cells, types, x = dolfinx.plot.vtk_mesh(V_h)\n grid = pyvista.UnstructuredGrid(cells, types, x)\n plotter = pyvista.Plotter()\n\n plotter.add_mesh(grid, scalars=discrete_solution.x.array, show_edges=True, cmap=\"coolwarm\")\n plotter.add_title(f\"solution\")\n\n # add axes labels for x and y axes\n plotter.show_bounds(\n grid=None,\n location=\"outer\",\n all_edges=True,\n )\n\n plotter.view_xy()\n plotter.show()" }, { - "objectID": "public-lecturer/content/exercises/homework03.html#tasks-6", - "href": "public-lecturer/content/exercises/homework03.html#tasks-6", - "title": "Hooke’s Law", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nAssume \\(\\mathbf{u}\\) is smooth and solves Equation 5. Show that \\(\\mathbf{D}\\) must satify the following six compatibility equations:\n\\[\nD_{nj, km} + D_{km, jn} - D_{kn, jm} - D_{mj, kn} = 0\n\\]\n\nNote\nThe subscripts before the comma denote the components. The subscript after the comma denote the derivatives." + "objectID": "public-lecturer/content/exercises/intro.out.html#post-processing-with-paraview", + "href": "public-lecturer/content/exercises/intro.out.html#post-processing-with-paraview", + "title": "", + "section": "Post-processing with Paraview", + "text": "Post-processing with Paraview\nWe can also visualize the solution using Paraview. To do that, we open the files written to the following location\n\nprint(vtk_file_abs_path_name)\n\n/root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp" }, { - "objectID": "public-lecturer/content/exercises/homework01.html", - "href": "public-lecturer/content/exercises/homework01.html", - "title": "Einstein Summation, Vector Algebra", + "objectID": "public-lecturer/content/exercises/intro.out.html#verification-comparing-with-the-exact-solution", + "href": "public-lecturer/content/exercises/intro.out.html#verification-comparing-with-the-exact-solution", + "title": "", + "section": "Verification: Comparing with the exact solution", + "text": "Verification: Comparing with the exact solution\nFor the simple 1D Poisson equation, we can easily compare with the analytical solution, which is just a linear connection of the boundary values, e.g.\n\\[\nu_{\\text{exact}}(x,y) = 1 - x \\quad \\text{ for } x \\in [0,1], y \\in [0,1]\n\\]\n\nfrom dolfinx.fem import assemble_scalar, form\nfrom petsc4py import PETSc\n\ndef u_exact(x):\n values = np.zeros((1 , x.shape[1]), dtype=PETSc.ScalarType)\n values[0] = 1.0 - x[0]\n return values\n\nu_ex = Function(V_h)\nu_ex.interpolate(u_exact)\n\nL2_error = form(dot(discrete_solution - u_ex, discrete_solution - u_ex) * dx)\n\nerror_L2 = np.sqrt(domain.comm.allreduce(assemble_scalar(L2_error), op=MPI.SUM))\nerror_max = domain.comm.allreduce(\n np.max(discrete_solution.x.petsc_vec.array - u_ex.x.petsc_vec.array), op=MPI.MAX\n)\n\nprint(\"L2 error with respect to the analytical solution: \" + str(error_L2))\nprint(\"Maximum error at the degrees of freedom: \" + str(error_max))\n\nL2 error with respect to the analytical solution: 1.2378947445213391e-16\nMaximum error at the degrees of freedom: 3.3306690738754696e-16" + }, + { + "objectID": "public-lecturer/content/exercises/homework06.html", + "href": "public-lecturer/content/exercises/homework06.html", + "title": "Stationary convection-diffusion", "section": "", - "text": "****Submission Deadline: 30.04.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "text": "****Submission Deadline: 16.07.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "public-lecturer/content/exercises/homework01.html#tasks", - "href": "public-lecturer/content/exercises/homework01.html#tasks", - "title": "Einstein Summation, Vector Algebra", + "objectID": "public-lecturer/content/exercises/homework06.html#tasks", + "href": "public-lecturer/content/exercises/homework06.html#tasks", + "title": "Stationary convection-diffusion", "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that the projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\nTask 2\nCalculate the dot-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\) in index notation\n\n\nTask 3\nUsing index notation, calculate the cross-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\)\n\n\nTask 4\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product \\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\nTip\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]" + "text": "Tasks\n\nTask 1\nExplain the physical meaning of the terms (I), (II), and (III) of the heat equation.\n\n\nTask 2\nGive the SI base units of \\(t\\), \\(x\\), \\(v\\), and \\(\\lambda\\).\n\n\nTask 3\nWe introduce the dimensionless variables\n\\[\n\\begin{aligned}\n t:=t_0\\tilde{t}, \\, x:=x_0\\tilde{x}, \\, v:=v_0\\tilde{v}, \\text{and } T:=\\underbrace{\\left(T_\\mathrm{wall} - T_\\mathrm{inf}\\right)}_{T_0} \\tilde{T} + T_\\mathrm{inf}.\n\\end{aligned}\n\\]\nWrite both equation Equation 1 and the boundary conditions Equation 2 in dimensionless variables. Identify the Peclet number \\(\\mathrm{Pe}=\\frac{v_0 x_0}{\\lambda}\\).\nNow consider a physical regime characterized by \\(t_0 \\gg \\frac{x_0^2}{\\lambda}\\).\n\n\nTask 4\nHow does the equation read in this physical regime?\n\n\nTask 5\nSolve for the temperature profile and sketch the solution.\n\n\nTask 6\nHow does the profile change as the thermal diffusivity decreases? Indicate it in the sketch!\n\n\nTask 7\nIf \\(\\lambda\\) doubles, how does the velocity need to change to retain the same profile?" }, { - "objectID": "public-lecturer/content/exercises/homework01.html#tasks-1", - "href": "public-lecturer/content/exercises/homework01.html#tasks-1", - "title": "Einstein Summation, Vector Algebra", + "objectID": "public-lecturer/content/exercises/homework06.html#tasks-1", + "href": "public-lecturer/content/exercises/homework06.html#tasks-1", + "title": "Stationary convection-diffusion", "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that the components of the tensor in the orthonormal basis {\\(\\mathbf{e}_1\\), \\(\\mathbf{e}_3\\), \\(\\mathbf{e}_2\\)} can be calculated as follows \\[\nA_{ij} = \\mathbf{e}_i \\cdot \\mathbf{A} \\mathbf{e}_j\n\\]\n\n\nTask 2\nUsing index notation, show that \\(\\mathbf{v} \\cdot \\mathbf{A}^{T}\\mathbf{u} = \\mathbf{u} \\cdot \\mathbf{A} \\mathbf{v}\\)." + "text": "Tasks\n\nTask 1\nInterpret the physical meaning of each of these conditions.\n\n\nTask 2\nIntroduce the similarity variable \\(\\eta := \\frac{x}{2\\sqrt{Dt}}\\) and write both temperature and mass diffusion (Equation 3), in terms of the similarity variable.\n\n\nTask 3\nThe resulting ODE system can be solved in terms of the (unknown) interface position \\(X_\\mathrm{m}=X(t)\\) and written in \\(x\\) and \\(t\\) again. Derive the solution (get inspired by the lecture).\n\n\nTask 4\nDiscuss which of the relations/boundary conditions 1. – 8. are fulfilled versus what is still unknown.\n\n\nTask 5\nMake the Ansatz: \\(X_\\mathrm{m}(t) = 2\\lambda\\sqrt{Dt}\\) (similar to lecture, but with \\(D\\) instead of \\(\\alpha\\)). Substitute the derived solutions for \\(T\\) and \\(C\\) into the Stefan condition and salt rejection and derive an algebraic system that allows us to determine \\(C_\\mathrm{i}\\), \\(T_\\mathrm{i}\\) and \\(\\lambda\\).\n\n\nTask 6\nCombine the derived equations into one equation for \\(\\lambda\\). Determine \\(\\lambda\\) for freezing sea water with \\(T_\\mathrm{B} = -10^\\circ C\\), \\(T_\\infty=2^\\circ C\\), \\(T_\\mathrm{m}=0^\\circ C\\), \\(C_\\infty=3.5\\%\\), \\(D=1.33 \\times 10^{-9}m^2s^{-1}\\) (Na-Ions in Water), \\(\\alpha_\\mathrm{ice} = 1.203 \\times 10^{9}m^2s^{-1}\\), \\(\\alpha_\\mathrm{water} = 0.14 \\times 10^{9}m^2s^{-1}\\), \\(L=334 \\times 10^{3} J\\), \\(c_p=2.05 \\times 10^{3} J kg^{-1} K^{-1}\\) and \\(m\\approx 1 K \\%^{-1}\\) (i.e., for each percent of salt the melting temperature is reduced by 1K; valid until about 20 % of salts). Plot the solution and discuss what you see." }, { - "objectID": "public-lecturer/content/exercises/homework01.html#tasks-2", - "href": "public-lecturer/content/exercises/homework01.html#tasks-2", - "title": "Einstein Summation, Vector Algebra", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nUsing a cartesian co-ordinate system, show that \\[\n\\nabla \\times (\\nabla u) = \\mathbf{0}\n\\]\n\n\nTask 2\nUsing a cylindrical co-ordinate system, show that \\[\n\\nabla \\cdot (\\nabla \\times \\mathbf{v}) = 0\n\\]\n\n\nTask 3\nCalculate in a spherical co-ordinate system the value of \\(\\Delta u\\)\n\n\nTask 4\nGiven another scalar field \\(\\alpha\\), using cartesian co-ordinates, show that\n\\[\n\\nabla \\cdot (\\alpha \\mathbf{v}) = \\alpha \\nabla \\cdot \\mathbf{v} + \\mathbf{v} \\cdot \\nabla \\alpha\n\\]" + "objectID": "public-lecturer/content/exercises/homework04.html", + "href": "public-lecturer/content/exercises/homework04.html", + "title": "Pipe Flow", + "section": "", + "text": "****Submission Deadline: 20.06.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "public-lecturer/content/exercises/homework01.html#tasks-3", - "href": "public-lecturer/content/exercises/homework01.html#tasks-3", - "title": "Einstein Summation, Vector Algebra", + "objectID": "public-lecturer/content/exercises/homework04.html#tasks", + "href": "public-lecturer/content/exercises/homework04.html#tasks", + "title": "Pipe Flow", "section": "Tasks", - "text": "Tasks\n\nTask 1\nUsing the mass balance law, calculate the value of \\[\n\\dfrac{1}{\\rho} \\dfrac{D(\\rho)}{Dt}\n\\]\n\n\nTask 2\nIn the Eulerian formulation, write down the momentum balance law in component notation.\n\nTip\nIn the Lagrangian formulation, the component notation of the momentum balance law is given as \\[\nx: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{xx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{xy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{xz}}{\\partial z}\\right) + b_x\n\\] \\[\ny: \\dfrac{Dv_{y}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{yx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{yy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{yz}}{\\partial z}\\right) + b_y\n\\] \\[\nz: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{zx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{zy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{zz}}{\\partial z}\\right) + b_z\n\\]\n\n\n\nTask 3\nIn the Eulerian formulation, write down the mass and momentum balance laws in index notation" + "text": "Tasks\n\nTask 1\nHow is the process model called?\n\n\nTask 2\nFor a constant pressure gradient \\(\\frac{\\partial p}{\\partial z} = -P\\), is the pressure greater at \\(z_0\\) or \\(z_1\\)?\n\n\nTask 3\nHow do mass and momentum balance read in cylindrical coordinates?\n\nTip\nGradient and divergence in cylindrical coordinates are given by:\n\n\n\nTask 4\nAssuming constant pressure in the cross-sectional area \\(\\frac{\\partial p}{\\partial {\\theta}} = \\frac{\\partial p}{\\partial r } = 0\\), how do mass and momentum balance reduce? What does this imply for the velocity field?\n\n\nTask 5\nFurthermore, there will be no change in the pipe’s flow field in time and no flow in radial direction or rotational direction. Hence \\(u_z = u_z(r, \\theta)\\) and \\(u_r = u_{\\theta} = 0\\). How does the remaining process model look like?\n\n\nTask 6\nDerive an explicit expression for the velocity profile. Also, derive an expression that yields the volume discharge?\n\n\nTask 7\nAssume that the pressure grdient drops by a factor of \\(50\\%\\). How can you change the setting to assure the same volume discharge?" }, { - "objectID": "public-lecturer/content/exercises/homework01.html#tasks-4", - "href": "public-lecturer/content/exercises/homework01.html#tasks-4", - "title": "Einstein Summation, Vector Algebra", + "objectID": "public-lecturer/content/exercises/homework04.html#tasks-1", + "href": "public-lecturer/content/exercises/homework04.html#tasks-1", + "title": "Pipe Flow", "section": "Tasks", - "text": "Tasks\n\nTask 1\nSketch two trajectories for \\(t \\in (0, 2 \\pi)\\) as well as their respective field values \\(\\phi(\\mathbf X(t), t)\\) over time.\n\n\nTask 2\nDescribe \\(\\phi(\\mathbf X(t), t)\\) in the Eulerian frame.\n\n\nTask 3\nConsider another field given by \\(\\psi(\\mathbf X(t), t) = X^2 + Y^2\\). Rewrite \\(\\psi\\) in the Eulerian frame.\n\n\nTask 4\nCompute \\(\\frac{d\\phi}{dt}\\) and \\(\\frac{D\\phi}{dt}\\) using their definitions." + "text": "Tasks\n\nTask 1\nDraw a sketch of the situation. Indicate all mentioned variables and the coordinate system. Explain why the velocity in both y- and z-direction vanish.\n\n\nTask 2\nDetermine an equation for the velocity profile in the fluid.\n\nTip\nThe volume flowing through a specific cross-section per unit time calculates as Here, with the width \\(L\\), this simplifies to\n\n\n\nTask 3\nDerive an equation for the volume flow rate per unit width.\n\n\nTask 4\nCalculate how much oil does the oil skimmer actually remove per unit time?" }, { - "objectID": "public-lecturer/content/exercises/homework01.html#tasks-5", - "href": "public-lecturer/content/exercises/homework01.html#tasks-5", - "title": "Einstein Summation, Vector Algebra", + "objectID": "public-lecturer/content/exercises/homework04.html#tasks-2", + "href": "public-lecturer/content/exercises/homework04.html#tasks-2", + "title": "Pipe Flow", "section": "Tasks", - "text": "Tasks\n\nTask 1\nCompute the pathlines.\n\n\nTask 2\nCompute the streamlines.\n\n\nTask 3\nCompute the streaklines.\n\n\nTask 4\nSketch the velocity field for\n\n\\(t_0 < \\frac{k x}{\\alpha}\\)\n\\(t_1 = \\frac{k x}{\\alpha}\\)\n\\(t_2 > \\frac{k x}{\\alpha}\\)\n\nand furthermore add\n\nthe pathline for one particular \\(\\mathbf x_0\\)\none particular streamline in each figure\nthe streakline starting at \\(t_0\\) for one particular \\(\\mathbf x_0\\)." + "text": "Tasks\n\nTask 1\nCompute the nondimensional version of Equation 2 using the scales\n\\[\n\\tilde{t} = t / t_0 \\quad \\tilde{x_i} = x_i / L_0 \\quad \\tilde{v_i} = v_i / U_{0} \\quad \\tilde{p} = p / p_0 \\quad.\n\\]\nYour expression should contain the following nondimensional numbers:\n\nStrouhal number \\(Str := \\frac{L_0}{t_0 \\, U_0}\\)\nReynold’s number \\(Re := \\frac{L_0 U_0}{\\nu}\\)\nMach number \\(Ma := \\frac{U_0}{a_0}\\)\n\nwhere \\(a_0\\) is the speed of sound in water. \\(a_0\\) is related to the other variables as \\(a_0^2 = \\frac{p_0}{\\rho_0}\\).\n\n\nTask 2\nAssume a steady flow with a small Mach number \\(Ma \\ll 1\\).\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\nNote\n\\(\\mathcal{o}(Ma^2)\\) indicates that all other terms are arbitrarily small compared to \\(Ma^2\\).\n\n\n\nTask 3\nAssume a steady flow with a small velocity \\(U_0 \\ll 1\\). Assume that all other quantities remain constant.\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\nTip\nIt makes sense to rewrite the Reynold’s number in terms of the Mach number times a constant. How is this constant defined?\n\n\n\nTask 4\nDescribe in your own words what the different equations model." }, { - "objectID": "content/exercises/intro.html", - "href": "content/exercises/intro.html", - "title": "My first FenicsX program", + "objectID": "public-lecturer/content/exercises/homework02.html", + "href": "public-lecturer/content/exercises/homework02.html", + "title": "Velocity Decomposition", "section": "", - "text": "This notebook gives a small introduction to FenicsX, an open-source FEM library. We use the Python API of FenicsX to solve an example PDE problem.\n\nLearning goals\n\nUnderstand the basic structure of a FenicsX program\nLearn the basic building blocks of modern FEM software: mesh, function space, boundary conditions, weak form, and solvers\n\n\n\nPoisson model\nIn this example, we solve the classical Poisson equation for a scalar \\(u\\),\n\\[\n-\\Delta u = f \\text{ in } \\Omega = \\left[0, \\,1\\right] \\times \\left[0,\\,1\\right], \\quad u = g \\text{ on } \\partial\\Omega \\quad ,\n\\]\nwhere \\(\\Omega\\) is the domain of interest, \\(f\\) is a given scalar source term, and \\(g\\) is a Dirichlet boundary condition.\n\n\nStructure\nBelow, we learn how to\n\ncreate a mesh for a simple domain\npick discrete FEM function spaces (which functions do we use to approximate the PDE solution?)\ndefine the weak form of the PDE\napply boundary conditions\nassemble and solve the linear system resulting from the discretization\nvisualize the solution\n\n\n\nLet’s go!\nFirst, we import some of the necessary python libraries\n\nfrom mpi4py import MPI\nimport numpy as np\nimport tqdm.autonotebook\n\ntry:\n import os\n\n username = os.getenv(\"USER\") or os.geteuid()\n\n # Set XDG_RUNTIME_DIR to a valid directory\n os.environ[\"XDG_RUNTIME_DIR\"] = f\"/tmp/runtime-{username}\"\n os.makedirs(os.environ[\"XDG_RUNTIME_DIR\"], exist_ok=True)\n os.chmod(os.environ[\"XDG_RUNTIME_DIR\"], 0o700)\nexcept Exception as e:\n print(f\"Failed to set XDG_RUNTIME_DIR: {e}\")\n print(\"You might get some warnings, but it should still work.\")\n\n/tmp/ipykernel_3316/138077527.py:3: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n import tqdm.autonotebook\n\n\n\n\nMesh and computational domain\nThe basis for our discretization is a discrete approximation \\(\\Omega_h\\) of the computational domain.\nHere, he have the choice between different discretization types, e.g. quadrilateral, triangular etc.\n\nfrom dolfinx import mesh\n\nnumber_elements = 5\ndomain = mesh.create_unit_square(\n MPI.COMM_WORLD, number_elements, 1, cell_type=mesh.CellType.quadrilateral\n)\n\n\n\nThe variational problem\nA key step in building finite element methods is the weak form of the PDE, upon which the discrete variational problem is based.\nIn all cases, the weak form is obtained by multiplying the PDE with a test function \\(v\\) and integrating over the domain \\(\\Omega\\).\nFurther operations on the resulting integral equations, such as integration by parts, can then be applied. This is often done improve the properties of the method, for example to - reduce the required regularity (we need less derivatives of the solution to exist) and hence allow for lower-order (=cheaper) finite element spaces - introduce symmetry to the (bi-)linear forms, which is favored by many linear solvers - introduce certain natural boundary conditions, e.g. the terms that appear as boundary integrals in the weak form\nA first key realization is that the weak form for a given PDE is not unique.\n\n\nA weak form for the Poisson equation\nA typical variational problem for the Poisson equation is given by\nFind \\(u \\in V\\) such that \\[\n\\int_\\Omega \\nabla u_h \\cdot \\nabla v_h \\, dx - \\cancel{\\int_{\\partial\\Omega} \\mathbf{\\nabla} u_h \\cdot \\mathbf{n} \\, v_h \\, ds} = \\int_\\Omega f v_h \\, dx\n\\] for all \\(v \\in V_{0}\\). Here \\(\\mathbf{n}\\) is the outward normal vector on the boundary \\(\\partial\\Omega\\) and \\(V_{0}\\) is the space of functions that vanish on the boundary, hence the boundary integral vanishes.\nThe discrete variational problem is obtained by replacing the continous domain \\(\\Omega\\) with its discrete approximation \\(\\Omega_h\\) (our mesh) and the continuous trial and test spaces \\(V\\) and \\(V_{0}\\) with the discrete finite element spaces \\(V_h\\) and \\(V_{h,0}\\), respectively.\nTechnical note: By default, FenicsX test functions are zero on parts of the boundary where Dirichlet conditions are applied. Since we only use Dirichlet condiitons in this example, we don’t have to worry about the boundary integral term and we omit the \\(V_{h,0}\\) notation.\n\n\nOur first finite element\nThe term “finite element” refers to the basis functions defined on our mesh. The idea of the finite element method is to find the best approximation of the solution \\(u\\) in a finite-dimensional function space \\(V_h\\).\nWe thus have to pick a finite element function space \\(V_h\\) on our mesh.\nTypically, the choice of the function space is crucial for the accuracy and convergence of the method (lego block analogy)\nLet’s start with a simple linear polynomial function space on the quadrilateral mesh that we created (check out what it looks like here)\n\n# used for plotting\nfrom dolfinx.fem import functionspace, Function, Constant, form\nfrom basix.ufl import element\n\n\nmesh_element_name = domain.topology.cell_name() \n\"\"\" type of mesh element, e.g. \"quadrilateral\" \"\"\"\nbasis_functions_degree = 1\n\"\"\" degree of the finite basis functions \"\"\"\n\nfinite_element = element(\n family=\"CG\", cell=domain.topology.cell_name(), degree=basis_functions_degree\n)\ndiscrete_fem_space = functionspace(mesh=domain, element=finite_element)\n\nLets have a look at our beautiful mesh:\n\ntry:\n shell = get_ipython().__class__.__name__\n has_visualization = True \nexcept NameError:\n has_visualization = False\n\nif has_visualization:\n import pyvista\n import dolfinx\n\n # Set the default window size globally\n pyvista.global_theme.window_size = (600, 600) # Adjust width and height as needed\n\n pyvista.set_jupyter_backend(\"static\")\n pyvista.start_xvfb()\n\n # Extract topology from mesh and create pyvista mesh\n topology, cell_types, x = dolfinx.plot.vtk_mesh(discrete_fem_space)\n grid = pyvista.UnstructuredGrid(topology, cell_types, x)\n\n plotter = pyvista.Plotter()\n plotter.add_title(f\"Mesh with {number_elements} elements\")\n plotter.add_mesh(grid, show_edges=True)\n plotter.camera_position = \"xy\"\n\n if not pyvista.OFF_SCREEN:\n plotter.show()\n else:\n plotter.screenshot(\"mesh.png\")\n\n\n\n\n\n\n\n\n\n\nFrom Math to Code: the weak form and UFL\nThe main advantage of software like FenicsX is that it provides a way to work in a syntax that is very close to the mathematical notation of the weak form. The underlying syntax is called UFL (Unified Form Language) and is a domain-specific language for finite element variational forms.\nLet’s see how we can write the weak form in UFL.\n\nfrom ufl import TestFunction, TrialFunction, dot, ds, dx, grad\n\nV_h = discrete_fem_space\n\"\"\" Discrete finite element space \"\"\"\n\nu_h = TrialFunction(V_h)\n\"\"\" discrete trial function \"\"\"\nv_h = TestFunction(V_h)\n\"\"\" discrete test function \"\"\"\n\nf = Constant(domain, 0.0)\n\"\"\" right-hand side source term \"\"\"\n\n# Define the weak form lhs == rhs\nweak_form_lhs = dot(grad(u_h), grad(v_h)) * dx\nweak_form_rhs = f * v_h * dx\n\n\n\nBoundary conditions\nThere are a couple of ways to apply boundary conditions in FenicsX. We cover the simplest way to set Dirichlet boundary conditions.\nThe basic idea is to tell FenicsX where we want to apply the Dirichlet boundary condition in terms of the mesh and then let the software figure out which nodes and facets of the mesh coincide with that geometrical location.\nWe therefore start by defining functions to tell FenicsX what we consider to be the left and right boundary of the domain (\\(x=0\\) and \\(x=1\\)).\n\n# return 1 on the left boundary of the unit square, e.g when x = (x,y)[0] close to 0\ndef left_boundary_marker(x):\n return np.isclose(x[0], 0.0)\n\n\n# return 1 on the right boundary of the unit square, e.g when x = (x,y)[0] close to 1\ndef right_boundary_marker(x):\n return np.isclose(x[0], 1.0)\n\nWe now create two boundary conditions for a constant value of \\(g=1\\) on the left boundary and \\(g=0\\) on the right boundary.\n\nfrom dolfinx.fem import dirichletbc, locate_dofs_topological\nfrom dolfinx.mesh import locate_entities_boundary\n\nmesh_topology_dim = domain.topology.dim\nfacet_geometrical_dimension = mesh_topology_dim - 1\n\nfacets_on_left_boundary = locate_entities_boundary(\n domain, facet_geometrical_dimension, left_boundary_marker\n)\ndofs_on_left_boundary = locate_dofs_topological(\n V_h, facet_geometrical_dimension, facets_on_left_boundary\n)\n\nvalue_left = Constant(domain, 1.0)\n\"\"\" value on the left boundary \"\"\"\nbc_left = dirichletbc(value_left, dofs_on_left_boundary, V_h)\n\nfacets_on_right_boundary = locate_entities_boundary(\n domain, facet_geometrical_dimension, right_boundary_marker\n)\ndofs_on_right_boundary = locate_dofs_topological(\n V_h, facet_geometrical_dimension, facets_on_right_boundary\n)\nvalue_right = Constant(domain, 0.0)\n\"\"\" value on the right boundary \"\"\"\nbc_right = dirichletbc(value_right, dofs_on_right_boundary, V_h)\n\ndirichlet_boundary_conditions = [bc_left, bc_right]\n\"\"\" list of Dirichlet boundary conditions \"\"\"\n\n' list of Dirichlet boundary conditions '\n\n\n\n\nAssemble and solve the linear system\nWe start by creating a discrete function to store our solution vector. The function lives in the same approximation space as our trial function \\(u_h\\) and is initialized to zero:\n\ndiscrete_solution = Function(V_h)\n\"\"\" discrete solution, a function in the finite element space. Our solution vector will be stored here \"\"\"\n\n' discrete solution, a function in the finite element space. Our solution vector will be stored here '\n\n\nThen, we create a writer for the VTK file to store our results on disk.\n\nfrom pathlib import Path\nfrom dolfinx.io import VTXWriter\n\nfrom pathlib import Path\n\nout_folder_path = Path(\"out_tutorial\")\nout_folder_path.mkdir(exist_ok=True, parents=True)\nvtx_writer = VTXWriter(\n domain.comm, out_folder_path / \"poisson_solution.bp\", discrete_solution, engine=\"BP4\"\n)\nvtx_writer.write(t=0.0)\n\nvtk_file_abs_path_name = str(out_folder_path.resolve()) + \"/poisson_solution.bp\"\nprint(\"Writing solution to file \" + vtk_file_abs_path_name)\n\nWriting solution to file /root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp\n\n\n\n\nThis is where the magic happens\nWe now reap the true benefit of modern FEM backends: we can assemble the linear system and solve it in a single line of code.\n\nfrom dolfinx.fem.petsc import LinearProblem\n\nlinear_solver_options = {\"ksp_type\": \"preonly\", \"pc_type\": \"lu\"}\n\nproblem = LinearProblem(\n weak_form_lhs,\n weak_form_rhs,\n bcs=dirichlet_boundary_conditions,\n petsc_options= linear_solver_options,\n)\n\n\ndiscrete_solution = problem.solve()\n\n# Write the solution to disk\nvtx_writer.write(t=1.0)\n\nOk… something happened … I guess? Let’s see if we can visualize the solution.\n\n\nVisualization\nThere are different ways to visualize the solution. For a check of the solution from within our python script, we can visualize the solution using pyvista.\nThe result is not super pretty but we can check that the solution indeed “looks” like a linear connection between the boundary conditions\n\nif has_visualization:\n cells, types, x = dolfinx.plot.vtk_mesh(V_h)\n grid = pyvista.UnstructuredGrid(cells, types, x)\n plotter = pyvista.Plotter()\n\n plotter.add_mesh(grid, scalars=discrete_solution.x.array, show_edges=True, cmap=\"coolwarm\")\n plotter.add_title(f\"solution\")\n\n # add axes labels for x and y axes\n plotter.show_bounds(\n grid=None,\n location=\"outer\",\n all_edges=True,\n )\n\n plotter.view_xy()\n plotter.show()\n\n\n\n\n\n\n\n\n\n\nPost-processing with Paraview\nWe can also visualize the solution using Paraview. To do that, we open the files written to the following location\n\nprint(vtk_file_abs_path_name)\n\n/root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp\n\n\n\n\nVerification: Comparing with the exact solution\nFor the simple 1D Poisson equation, we can easily compare with the analytical solution, which is just a linear connection of the boundary values, e.g.\n\\[\nu_{\\text{exact}}(x,y) = 1 - x \\quad \\text{ for } x \\in [0,1], y \\in [0,1]\n\\]\n\nfrom dolfinx.fem import assemble_scalar, form\nfrom petsc4py import PETSc\n\ndef u_exact(x):\n values = np.zeros((1 , x.shape[1]), dtype=PETSc.ScalarType)\n values[0] = 1.0 - x[0]\n return values\n\nu_ex = Function(V_h)\nu_ex.interpolate(u_exact)\n\nL2_error = form(dot(discrete_solution - u_ex, discrete_solution - u_ex) * dx)\n\nerror_L2 = np.sqrt(domain.comm.allreduce(assemble_scalar(L2_error), op=MPI.SUM))\nerror_max = domain.comm.allreduce(\n np.max(discrete_solution.x.petsc_vec.array - u_ex.x.petsc_vec.array), op=MPI.MAX\n)\n\nprint(\"L2 error with respect to the analytical solution: \" + str(error_L2))\nprint(\"Maximum error at the degrees of freedom: \" + str(error_max))\n\nL2 error with respect to the analytical solution: 1.2378947445213391e-16\nMaximum error at the degrees of freedom: 3.3306690738754696e-16", - "crumbs": [ - "Exercises", - "My first FenicsX program" - ] + "text": "****Submission Deadline: 14.05.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "content/resources/index-student.html", - "href": "content/resources/index-student.html", - "title": "Resources", - "section": "", - "text": "Date\n\n\nTitle\n\n\nAuthor\n\n\n\n\n\n\n\nNo matching items" + "objectID": "public-lecturer/content/exercises/homework02.html#tasks", + "href": "public-lecturer/content/exercises/homework02.html#tasks", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nDecompose the given velocity fields and calculate for each field: \\(\\mathbf{w}\\) and \\(\\mathbf{D}\\)\n\n\nTask 2\nDescribe the motion produced by each velocity field.\n\n\nTask 3\nSketch each flow field within a domain given by \\(x,y \\in [-4, 4]\\times [-4, 4]\\)\n\n\nTask 4\nWithin the flow field, sketch how a volume element having vertices \\((1, 1), (1, 2), (2, 2), (2,1)\\) deforms." }, { - "objectID": "content/slides/fundamentals/index.html#material-and-particle-point", - "href": "content/slides/fundamentals/index.html#material-and-particle-point", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Material and particle point", - "text": "Material and particle point\n\n\n\n\n\n\nNote\n\n\nSee drawing during class!\n\n\n\nIn order to predict the motion, deformation and phase-transition of a material, we think of it as an idealized medium that is continuously filling a region in three-dimensional space.\nWe discriminate a particle point and a material point:\n\nmaterial point: the “exact” position within the medium with its micro-scale properties\nparticle point: an intermediate-scale position within the medium that has all its properties\n\n\nOpen question:\nThe particle point seems to be larger than a material point, yet from a continuum mechanical perspective, a particle point should be infinitesimally small, such that we can translate reality into mathematical models.\nHow can we formalize this concept?" + "objectID": "public-lecturer/content/exercises/homework02.html#setup", + "href": "public-lecturer/content/exercises/homework02.html#setup", + "title": "Velocity Decomposition", + "section": "Setup", + "text": "Setup\nFor the visualization, we shall use the python libraries numpy and matplotlib. Here, we first import the libraries\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\n\nLet us define a grid of points within the domain \\(x, y \\in [-5, 5] \\times [-5, 5]\\)\n\nx, y = np.meshgrid(np.linspace(-5,5,21),np.linspace(-5,5,21))" }, { - "objectID": "content/slides/fundamentals/index.html#intermediate-asymptotics", - "href": "content/slides/fundamentals/index.html#intermediate-asymptotics", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Intermediate Asymptotics", - "text": "Intermediate Asymptotics\nA material is assumed to have an intermediate asymptotics if there are scales \\(X_1\\) and \\(X_2\\), such that an interval \\(\\mathcal I\\) exists, for which:\n\n\\(X_1 \\ll x\\), for \\(x \\in \\mathcal I\\), hence \\(\\tfrac{x}{X_1} \\to \\infty\\)\n\\(x \\ll X_2\\), for \\(x \\in \\mathcal I\\), hence \\(\\tfrac{x}{X_2} \\to 0\\)\n\nThis is formaly referred to as \\(X_1 \\lll X_2\\).\nIntermediate asymptotics exist for materials, in which the characteristic length-scale of the microstructure \\(X_1\\) (often also denoted \\(\\delta\\)) is much smaller than the characteristic length scale of the problem setting \\(X_2\\) (often also denoted by \\(L\\)), hence (\\(\\delta \\lll L\\)).\nIn such a situations, we can safely assume the continuum assumption to apply within all scales that fall into the intermediate interval \\(\\mathcal I\\)." + "objectID": "public-lecturer/content/exercises/homework02.html#task1---velocity-field", + "href": "public-lecturer/content/exercises/homework02.html#task1---velocity-field", + "title": "Velocity Decomposition", + "section": "Task1 - Velocity Field", + "text": "Task1 - Velocity Field\n\nComputation\nImplement the computation for the components of the velocity vector at every point \\((x, y)\\) on the grid using numpy math functions.\n\n\nVisualization\nWe can now visualize the velocity field using a quiver plot\n\nplt.quiver(x,y,v_x, v_y)\nplt.gca().set_aspect('equal')\nplt.xlabel(\"x\")\nplt.ylabel(\"y\")\nplt.title(\"Velocity field\");\nplt.xticks([-5, 0, 5]);\nplt.yticks([-5, 0, 5]);" }, { - "objectID": "content/slides/fundamentals/index.html#intermediate-asymptotics-1", - "href": "content/slides/fundamentals/index.html#intermediate-asymptotics-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Intermediate Asymptotics", - "text": "Intermediate Asymptotics\nExamples are:\n\nFluids: The ratio of the molecular free path and the characteristic length scale is usually very small. This ratio is also referred to as the Knudsen Number. Systems with a Knudsen Number \\(<0.1\\) can be regarded as continuous.\nPorous media: Porous media can be treated as continuous, when we are interested in a scale that is much larger than the characteristic pore size, e.g. in reservoir engineering. This is different, when we are interested in processes on the pore size level.\n\n\nAn observer of a continuous medium provides\n\na reference system, e.g. an inertial reference system\na clock that allows to measure time\na system of units sufficient for the phenomena that we consider" + "objectID": "public-lecturer/content/exercises/homework02.html#task-2---velocity-gradient", + "href": "public-lecturer/content/exercises/homework02.html#task-2---velocity-gradient", + "title": "Velocity Decomposition", + "section": "Task 2 - Velocity Gradient", + "text": "Task 2 - Velocity Gradient\nThe velocity gradient \\(\\nabla \\mathbf{v}\\) is a second order tensor, and hence cannot be visualized on a 2D plot. Here, we shall look at the individual components of the velocity gradient tensor.\n\nComputation\nCalculate the components of the velocity gradient tensor and implement the computation in the following\n\n\nVisualization\nWe can now visualize the components of the velocity gradient individually.\n\nfigure, axs = plt.subplots(nrows=2, ncols=2, figsize=(9, 7))\nmin_val = np.min([np.min(dvx_dx), np.min(dvx_dy), np.min(dvy_dx), np.min(dvy_dy)])\nmax_val = np.max([np.max(dvx_dx), np.max(dvx_dy), np.max(dvy_dx), np.max(dvy_dy)])\naxs[0, 0].imshow(dvx_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 0].quiver(x,y,v_x, v_y)\naxs[0, 0].set_xticks([-5, 0, 5])\naxs[0, 0].set_yticks([-5, 0, 5])\naxs[0, 0].set_xlabel(\"x\")\naxs[0, 0].set_ylabel(\"y\")\naxs[0, 0].set_title(r'$\\partial_x v_x$')\n\naxs[0, 1].imshow(dvx_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 1].quiver(x,y,v_x, v_y)\naxs[0, 1].set_xticks([-5, 0, 5])\naxs[0, 1].set_yticks([-5, 0, 5])\naxs[0, 1].set_xlabel(\"x\")\naxs[0, 1].set_ylabel(\"y\")\naxs[0, 1].set_title(r'$\\partial_y v_x$')\n\naxs[1, 0].imshow(dvy_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 0].quiver(x,y,v_x, v_y)\naxs[1, 0].set_xticks([-5, 0, 5])\naxs[1, 0].set_yticks([-5, 0, 5])\naxs[1, 0].set_xlabel(\"x\")\naxs[1, 0].set_ylabel(\"y\")\naxs[1, 0].set_title(r'$\\partial_x v_y$')\n\nim = axs[1, 1].imshow(dvy_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 1].quiver(x,y,v_x, v_y)\naxs[1, 1].set_xticks([-5, 0, 5])\naxs[1, 1].set_yticks([-5, 0, 5])\naxs[1, 1].set_xlabel(\"x\");\naxs[1, 1].set_ylabel(\"y\");\naxs[1, 1].set_title(r'$\\partial_y v_y$');\n\nfigure.subplots_adjust(right=0.8)\ncax,kw = mpl.colorbar.make_axes([ax for ax in axs.flat])\nplt.colorbar(im, cax=cax, **kw)\nplt.show()" }, { - "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space", - "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Repetition: What is a vector space?", - "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V,\\)\nwhich fullfill the following properties for each \\(\\mathbf{u},\\mathbf{v},\\mathbf{w} \\in V\\) and \\(a,b \\in F\\):\n\n(V1) Associativity of vector addition: \\((\\mathbf{u}+\\mathbf{v})+\\mathbf{w} = \\mathbf{u}+(\\mathbf{v}+\\mathbf{w})\\)\n(V2) Commutativity of vector addition: \\(\\mathbf{u}+\\mathbf{v} = \\mathbf{v}+\\mathbf{u}\\)\n(V3) Identity / neutral element of vector addition \\(\\mathbf{0}\\): \\(\\mathbf{u}+\\mathbf{0} = \\mathbf{0}+\\mathbf{u} = \\mathbf{u}\\)\n(V4) Inverse element of vector addition (zero vector) \\(-\\mathbf{u}\\): \\(\\mathbf{u}+(-\\mathbf{u}) = (-\\mathbf{u})+\\mathbf{u} = \\mathbf{0}\\)" + "objectID": "public-lecturer/content/exercises/homework02.html#task-3---divergence-of-velocity", + "href": "public-lecturer/content/exercises/homework02.html#task-3---divergence-of-velocity", + "title": "Velocity Decomposition", + "section": "Task 3 - Divergence of Velocity", + "text": "Task 3 - Divergence of Velocity\n\nComputation\nCalculate the divergence of the velocity field using already computed quatities, and implement it in the following.\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result" }, { - "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-1", - "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Repetition: What is a vector space?", - "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V,\\)\nwhich fullfill the following properties for each \\(\\mathbf{u},\\mathbf{v},\\mathbf{w} \\in V\\) and \\(a,b \\in F\\):\n\n(V5) Compatibility of vector addition and scalar multiplication: \\(a \\cdot (\\underbrace{b \\cdot \\mathbf{u}}_{\\text{scalar multiplication}}) = \\underbrace{(a b)}_{\\text{in }F} \\cdot \\mathbf{u}\\)\n(V6) Identity element of scalar multiplication \\(1\\): \\(1 \\cdot \\mathbf{u} = \\mathbf{u} \\cdot 1 =\\mathbf{u}\\)\n(V7) Distributivity of scalar multiplication w.r.t. vector addition: \\(a \\cdot (\\mathbf{u}+\\mathbf{v}) = a \\cdot \\mathbf{u} + a \\cdot \\mathbf{v}\\)\n(V8) Distributivity of scalar multiplication w.r.t. addition in \\(F\\): \\((a+b) \\cdot \\mathbf{u} = a \\cdot \\mathbf{u} + b \\cdot \\mathbf{u}\\)" + "objectID": "public-lecturer/content/exercises/homework02.html#task-4---vorticity", + "href": "public-lecturer/content/exercises/homework02.html#task-4---vorticity", + "title": "Velocity Decomposition", + "section": "Task 4 - Vorticity", + "text": "Task 4 - Vorticity\n\nComputation\nCalculate the vorticity (or curl) of the velocity field using previously computed quantities and implement it in the following\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result." }, { - "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-2", - "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-2", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Repetition: What is a vector space?", - "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V.\\)\n\nDirect consequences of the above properties are the following:\n(VC1) Multiplication with field zero implies zero vector: \\(0 \\cdot \\mathbf u = \\mathbf 0\\)\n(VC2) Multiplication with zero vector has no effect: \\(a \\cdot \\mathbf 0 = \\mathbf 0\\)\n(VC3) Multiplication with field negative 1 implies inverse element of vector addition: \\((-1) \\cdot \\mathbf u = - \\mathbf u\\)\n(VC4) Zero product property is inherited by the scalar multiplication: \\(a \\cdot \\mathbf u = 0 \\; \\Rightarrow \\; a=0 \\; \\text{and/or} \\; \\mathbf u = \\mathbf 0\\)" + "objectID": "public-lecturer/content/exercises/homework02.html#tasks-1", + "href": "public-lecturer/content/exercises/homework02.html#tasks-1", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nState the Bernoulli equation and explain to what fluid flow scenarios can it be applied.\n\n\nTask 2\nCalculate the velocity of the flowing fluid in terms of the difference in height of the fluid \\(\\Delta h\\) in the U-shaped tube and other given quantities given in the figure.\n\n\nTask 3\nIf the velocity of the inflowing fluid is doubled, how would \\(\\Delta h\\) change?" }, { - "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-3", - "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-3", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Repetition: What is a vector space?", - "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V.\\)\n\nCommon examples are\n\nReal vector space for which \\(F=\\mathbb R\\),\n\nComplex vector space for which \\(F=\\mathbb C\\)\nReal vector space for which \\(F=\\mathbb R^3\\)\n\n\nRemark:\nUnless otherwise stated, we will refer to \\(F=\\mathbb R^3\\) if we talk about the vector space. It is important to keep in mind, however, that this is just one example of a vector space!" + "objectID": "public-lecturer/content/exercises/homework02.html#tasks-2", + "href": "public-lecturer/content/exercises/homework02.html#tasks-2", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" }, { - "objectID": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space", - "href": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "How can we navigate in a vector space?", - "text": "How can we navigate in a vector space?\nLet’s consider vectors \\(\\mathbf v_i \\in V\\) and scalars \\(\\alpha_i \\in F\\) for \\(i=1,...,n\\).\n\n\n\\(\\mathbf w = \\sum_{i=1}^{n} \\alpha_i \\mathbf v_i\\) is called a linear combination, hence a weighted superposition of a finite number of elements of \\(V\\).\n\n\n\n\nThe vectors \\(\\mathbf v_i\\) are called linearly independent if \\(\\sum_{i=1}^{n} \\alpha_i \\mathbf v_i=0\\) implies \\(\\alpha_i = 0\\) for all \\(i=1,...,n\\) (see LA textbook for equivalent definitions!)\n\n\n\n\nA subset \\(U \\subset V\\) is called a linear subset if it is closed under vector addition, hence \\(\\mathbf u + \\mathbf v \\in U\\) for all \\(\\mathbf u, \\mathbf v \\in U\\).\n\n\n\n\nA linear span, denoted by \\(span(\\{\\mathbf v_i \\})\\), is the smallest linear subspace that contain \\(\\{\\mathbf v_i \\}\\), hence all its linear combinations!" + "objectID": "public-lecturer/content/exercises/homework02.html#tasks-3", + "href": "public-lecturer/content/exercises/homework02.html#tasks-3", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nWe want to derive a non-parametric representation of Mohr’s Circle in 2D.\nThe transformation rule for second order tensors is given as\n\\[\n\\sigma' = \\mathbf{R} \\, \\sigma \\, \\mathbf{R}^T\n\\]\nwhere \\(\\mathbf{R}\\) is the rotation matrix\n\\[\n\\mathbf{R}(\\theta)\n=\n\\begin{pmatrix}\ncos(\\theta) & -sin(\\theta) \\\\\nsin(\\theta) & cos(\\theta) \\\\\n\\end{pmatrix}\n\\].\nProceed as follows:\n\nLet \\(\\sigma_x' = \\sigma_n\\) be the normal stress and \\(\\tau_{xy} = \\tau_{n}\\) be the shear stress. Derive a parametric representation of \\(\\sigma_n\\) and \\(\\tau_n\\) using the transformation rule given above.\nSimplify the expression by using trigonometric rules (Hint: we aim for expressions of \\(2\\theta\\))\nObtain a non-parametric expression of a circle, \\((x-a)^2 + (y-b)^2 = r^2\\).\n\n\n\nTask 2\nCompute for \\(\\mathbf{S}_1\\) using Mohr’s circle:\n\nThe maximum shear stress and the angle \\(\\theta\\)\nThe maximal normal stress and the angle \\(\\theta\\)\nThe minimal normal stress and the angle \\(\\theta\\)\n\n\n\nTask 3\nCompute the principal stresses \\((\\sigma_1, \\sigma_2, \\sigma_3)\\) of \\(\\mathbf{S}_2\\). We can now construct Mohr’s circle in 3d as follows:\n\nDraw a coordinate system \\((\\sigma_n, \\tau_n)\\)\nMark the principal stresses on the abscissa\nDraw three circles, each circle passes through two of the three principal stresses marked on the abscissa.\n\n\n\nTask 4\nCompute for \\(\\mathbf{S}_2\\) using Mohr’s circle:\n\nThe maximum shear stress.\nThe maximal normal stress and the correpsonding directional vector.\nThe minimal normal stress and the corresponding directional vector." }, { - "objectID": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space-1", - "href": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "How can we navigate in a vector space?", - "text": "How can we navigate in a vector space?\nA set of vectors \\(\\{\\mathbf b_i\\} \\subset V\\) is called a basis if they are linearly independent and form a span of \\(V\\).\n\nEach vector space has at least one basis.\nThe number of basis vectors denotes the dimension of \\(V\\).\nThere are finite dimensional and infinite dimensional vector spaces.\n\n\nImportant consequence:\nFor each element \\(\\mathbf v \\in V\\), we have\n\\[ \\mathbf v = \\sum_{i=1}^n \\alpha_i \\mathbf b_i \\]\nwith \\(n=dim(V)\\) and coordinates/coefficients \\(\\alpha_i\\) unique for a specific set of basis vectors.\nEamples: Eucledian vector space \\(\\mathbb R^3\\) has dimension 3." + "objectID": "public-lecturer/content/exercises/homework02.html#tasks-4", + "href": "public-lecturer/content/exercises/homework02.html#tasks-4", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nDerive the weak formulation of the problem assuming that the displacement \\(\\mathbf{u} \\in H^1(\\Omega)\\) and test function \\(\\phi \\in H^1(\\Omega)\\). Make sure to differentiate between the Dirichlet and Neumann boundary term. Why is the implementation of the Dirichlet term in this weak formulation difficult?\n\nNote\nRecall the very common notation that a function space with subscript zero, e.g. \\(\\mathbb{V}_0\\) denotes compact support. For our purposes, this means that the function vanishes at the boundary.\n\n\nNote\nRecall from your PDE class that \\(H^1\\) denotes a Hilbert space.\n\n\nTip\nRecall from your PDE-class that a weak formulation is derived by multiplying your problem with a test function (e.g. denoted as \\(\\phi\\)) and integrated over the domain \\(\\Omega\\). Often, integration by parts is employed to reduce the demands on the funtional space of the solution.\nYour weak formulation always needs to be stated in a way similar to the following:\nFind \\(\\mathbf{u} \\in \\mathbb{V}\\) such that \\[\n \\begin{cases}\n & \\text{YOUR } \\\\\n & \\text{PROBLEM} \\\\\n & \\text{STATEMENT} \\\\\n \\end{cases}\n\\] \\(\\forall \\phi \\in \\mathbb{W}\\)\nWhere \\(\\phi \\in \\mathbb{W}\\) denotes the test function we used to derive the weak form.\n\n\n\nTask 2\nA typical solution strategy to solve the issue with the Dirichlet boundary condition is to ‘lift’ the problem. We will do this step by step\n\nConstruct a (simple) function \\(\\mathbf b(x, y)\\) that fulfills \\(\\mathbf b(0, y) = \\mathbf g_0(y)\\) and \\(\\mathbf b(1, y) = \\mathbf g_1(y)\\).\nDefine a new function \\(\\mathbf w = \\mathbf u - \\mathbf b\\)\nConsider a suitable function space for \\(w\\). What changed compared to the function space of \\(u\\)?\nSubstituve \\(\\mathbf w\\) into the strong formulation of our problem. Do not forget the boundary conditions.\nWrite down the weak formulation for the problem statement derived in 4. Make sure to choose an approriate (and useful) function space for the test function as well.\nAssume you are given the solution \\(\\mathbf w^*\\) for the weak formulation you posed in 5. Write down the solution for \\(\\mathbf u\\)." }, { - "objectID": "content/slides/fundamentals/index.html#vectors-in-euclidean-space-mathbb-r3", - "href": "content/slides/fundamentals/index.html#vectors-in-euclidean-space-mathbb-r3", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Vectors in Euclidean space \\(\\mathbb R^3\\)", - "text": "Vectors in Euclidean space \\(\\mathbb R^3\\)\nUnless otherwise stated, the vector space in this course will be \\(\\mathbb R^3\\), such that we can think of the vector to be represented by an element of \\(\\mathbb R^3\\) that has a unique coordinate representation.\nThis implies a magnitude and a direction, hence\n\\[ \\mathbf v = (v_1,v_2,v_3)^T = \\underbrace{|\\mathbf v|}_{\\text{magnitude}} \\quad \\underbrace{\\mathbf e_v}_{\\text{direction}}\\]\nWe always have \\(|\\mathbf v| \\geq 0\\). A vector with \\(\\mathbf v\\) with \\(|\\mathbf v|=1\\) is called a unit vector. Two vectors are the same if they coincide in magnitude and direction.\n\nRecall your background knowledge on vectors: In going forward, you should be familiar with scalar product and vector product." + "objectID": "public-lecturer/content/exercises/homework02.html#tasks-5", + "href": "public-lecturer/content/exercises/homework02.html#tasks-5", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nCompute the Cauchy stress tensor \\(\\mathbf{\\sigma} \\in \\mathbb{R}^{3x3}\\) by directly solving the linear system associated with \\(\\mathbf{t}^i = \\mathbf{\\sigma} \\mathbf{n}^i\\) for \\(i=\\{1,2,3\\}\\).\n\nNote\nYou can use your computer to solve the system if you want.\n\n\n\nTask 2\nNow we want to solve for the stress tensor without the need to solve a linear system. You can do so by changing the coordinate system such that\n\\[\n \\mathbf{\\tilde{t}} = \\mathbf{\\tilde{\\sigma}} \\mathbf{n} = \\mathbf{\\tilde{\\sigma}} \\mathbf{e}\n\\]\nwhere \\(\\mathbf{n}\\) is an arbitrary vector of unit length and \\(\\mathbf{e}\\) is a cartesian unit vector. Then the rows of \\(\\mathbf{\\tilde{\\sigma}}\\) are given \\(\\mathbf{\\tilde{t}}\\)." }, { - "objectID": "content/slides/fundamentals/index.html#vectors---important-conclusion", - "href": "content/slides/fundamentals/index.html#vectors---important-conclusion", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Vectors - important conclusion", - "text": "Vectors - important conclusion\nFor a basis \\(\\{\\mathbf e_1, \\mathbf e_2, \\mathbf e_3 \\}\\) in \\(\\mathbb R^3\\), we get can write any vector uniquely in its components:\n\\[ \\mathbf v = v_1 \\mathbf e_1 + v_2 \\mathbf e_2 + v_3 \\mathbf e_3 \\quad \\left( = v_i \\mathbf e_i \\right)\\]\nwith \\([\\mathbf v] = (v_1,v_2,v_3)^T\\) being the coordinates of vector \\(\\mathbf v\\)." + "objectID": "public-lecturer/content/exercises/homework02.html#tasks-6", + "href": "public-lecturer/content/exercises/homework02.html#tasks-6", + "title": "Velocity Decomposition", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nWe are now interessted in gaining a better understanding of the physical meaning of the theorem.\nFor that matter, proceed as follows:\n\nWrite down the Divergence Threorem while explicitly keeping track of the dependence on the spatial coordinate \\(\\mathbf{x} \\in B\\), where \\(B = (\\mathbf{y}, \\delta)\\) indicates a ball with center point \\(y\\) and radius \\(\\delta\\).\nNow we would like to rewrite the divergence term in an expansion around the center point \\(\\mathbf{y}\\) and higher order terms\nSimplify the integral by introducing \\(vol(B)\\).\nIsolate the divergence term and take the limit for \\(\\delta \\rightarrow 0\\).\nInterpret the final relation in your own words.\n\n\n\nTask 2\nGiven \\(\\Omega\\) and \\(\\partial \\Omega\\) as before, we now consider an arbitrary second-order tensor \\(\\mathbf S \\in \\mathbb{R}^{3\\times3}\\). Prove the Tensor Divergence Theorem\n\\[\n\\int_{\\Omega} \\nabla \\cdot \\mathbf S \\: d \\: \\Omega = \\int_{\\partial \\Omega} \\mathbf S \\cdot \\mathbf n \\: d \\: A\n\\qquad(1)\\]\n\nTip\nMultiply (dot product) Equation 1 with an arbitrary (constant) vector. Make use of the Divergence Theorem to proof the Tensor Divergence Theorem." }, { - "objectID": "content/slides/fundamentals/index.html#second-order-tensors", - "href": "content/slides/fundamentals/index.html#second-order-tensors", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Second order tensors", - "text": "Second order tensors\nPhysical quantities, such as stress and strain cannot be represented as vectors, but rather by linear transformations between vectors.\nA second order tensor on the vector space \\(V\\) is hence a mapping \\(\\mathbf T : V \\rightarrow V\\), which is linear for all \\(\\mathbf u, \\mathbf v \\in V\\) and \\(\\alpha \\in F\\), hence\n\\[ \\mathbf T(\\mathbf u + \\mathbf v) = \\mathbf T(\\mathbf u) + \\mathbf T(\\mathbf v) \\quad \\mathbf T( \\alpha \\mathbf u) = \\alpha \\mathbf T(\\mathbf u)\\]" + "objectID": "public-lecturer/content/exercises/exercise01.html", + "href": "public-lecturer/content/exercises/exercise01.html", + "title": "Index notation", + "section": "", + "text": "In a right-handed, orthonormal system of fixed basis vectors \\(\\mathbf{e}_1\\), \\(\\mathbf{e}_2\\) and \\(\\mathbf{e}_3\\) of unit length, an arbitrary vector \\(\\mathbf{u}\\) has the following co-ordinate (component) expression\n\\[\n\\mathbf{u} = u_1 \\mathbf{e}_1 + u_2 \\mathbf{e}_2 + u_3 \\mathbf{e}_3 = \\sum_{i=1}^{3} u_i \\mathbf{e}_i = \\begin{pmatrix} u_1 \\\\ u_2 \\\\ u_3 \\end{pmatrix}\n\\]\nBy dropping the summation symbol, we get the vector \\(\\mathbf{u}\\) in Einstein summation convention as follows \\[\n\\mathbf{u} = u_i \\mathbf{e}_i\n\\] where a summation is implied in an expression, whenever indices occur twice. The repeated indices are called free or dummy indices. In order to evaluate and simplify expressions in vector and tensor algebra we make use of\n\\[\n\\delta_{ij} = \\begin{cases}\n 1,& \\text{if } i=j\\\\\n 0,& \\text{if } i\\not=j\n\\end{cases}\n\\]\nFor the dot product of two orthonormal basis vectors we have \\[\n\\mathbf{e}_i \\cdot \\mathbf{e}_j = \\delta_{ij}\n\\]\nWe often require you to change the notation from one form to another.\nExample:" }, { - "objectID": "content/slides/fundamentals/index.html#second-order-tensors-1", - "href": "content/slides/fundamentals/index.html#second-order-tensors-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Second order tensors", - "text": "Second order tensors\nFor a basis \\(\\{\\mathbf e_1, \\mathbf e_2, \\mathbf e_3 \\}\\), we get can write any second order tensor in its components according to\n\\[ [S] = S_{ij} = \\mathbf e_i \\cdot \\mathbf S \\mathbf e_j\\]\nThe coordinates can hence be represented as a matrix \\(S_{ij}\\).\nThe space of second order tensors is itself a vector space of basis \\(\\{\\mathbf e_i \\otimes \\mathbf e_j\\}\\), in which the dyadic product is defined as\n\\[(\\mathbf u \\otimes \\mathbf v) \\mathbf a = (\\mathbf a \\cdot \\mathbf v)\\mathbf u\\]\nfor all \\(\\mathbf a \\in \\mathcal V\\). We then get\n\\[ [S + T] = [S] + [T] \\qquad [\\alpha S] = \\alpha [T]\\]" + "objectID": "public-lecturer/content/exercises/exercise01.html#tasks", + "href": "public-lecturer/content/exercises/exercise01.html#tasks", + "title": "Index notation", + "section": "Tasks", + "text": "Tasks\n\nShow that the scalar projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\n\nWrite out the dot-product of two arbitrary vectors \\(\\mathbf{u} \\cdot \\mathbf{v}\\) in component notation and index notation.\n\n\n\nWrite the cross-product of two arbitrary vectors \\(\\mathbf{u} \\times \\mathbf{v}\\) in component notation and in index notation.\n\n\n\nWrite the expression \\(\\left(\\mathbf{u} \\cdot \\nabla \\right) \\mathbf{u}\\) in component notation and in index notation.\n\n\n\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product\n\n\\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\nTip\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]" }, { - "objectID": "content/slides/fundamentals/index.html#second-order-tensors-2", - "href": "content/slides/fundamentals/index.html#second-order-tensors-2", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Second order tensors", - "text": "Second order tensors\nRecall your background knowledge on the properties of second order tensors and their matrix representation: In going forward, you should be familiar with\n\ntransposition of a matrix / tensor\nsymmetry of a matrix / tensor\nskewsymmetry of a matrix / tensor\n\nYou should know what is meant and how to test a matrix / tensor to be\n\npositive definite\ninvertible\northogonal." + "objectID": "content/exam/index-student.html", + "href": "content/exam/index-student.html", + "title": "Old exams", + "section": "", + "text": "Order By\n Default\n \n Title\n \n \n Date - Oldest\n \n \n Date - Newest\n \n \n \n \n \n \n \n\n\n\n\n\nDate\n\n\nTitle\n\n\n\n\n\n\n2023 01 01\n\n\nExam Problem WS 23\n\n\n\n\n2023 08 01\n\n\nExam Problem SS 23\n\n\n\n\n2024 08 14\n\n\nExam Problem SS 24\n\n\n\n\n2025 03 18\n\n\nExam Problem WS 24\n\n\n\n\n\nNo matching items" }, { - "objectID": "content/slides/fundamentals/index.html#second-order-tensors-3", - "href": "content/slides/fundamentals/index.html#second-order-tensors-3", + "objectID": "content/slides/introduction/index.html#goal-of-the-lecture", + "href": "content/slides/introduction/index.html#goal-of-the-lecture", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Second order tensors", - "text": "Second order tensors\nA second order tensor can always be decomposed into a symmetric and a skewsymmetric part \\[ \\mathbf S = \\mathbf E + \\mathbf W\\]\nin which \\[ \\mathbf E = \\frac{1}{2} (\\mathbf S + \\mathbf S^T) \\qquad \\mathbf W = \\frac{1}{2} (\\mathbf S - \\mathbf S^T)\\]\nAs mappings, \\(\\mathbf E\\) and \\(\\mathbf W\\) are referred to as \\(sym(\\mathbf S)\\) and \\(skew(\\mathbf S)\\)." + "section": "Goal of the lecture", + "text": "Goal of the lecture\nThis lecture provides an introduction to\ncontinuum mechanical modeling from the perspective of simulation science and computational engineering.\nStarting from fundamentals and balance laws, we consider\nimportant classes of mathematical models\nfor transport, flow and multiphysics processes. We also discuss\ncomplexity reduction strategies\nsuch as homogenization and depth-averaging to enable the simulation of porous media flow, free-surface flow and solid-liquid phase change processes.\nComplementary theoretical and programming exercises\nhelp to consolidate the content of this lecture and provide theoretical and application-oriented examples." }, { - "objectID": "content/slides/fundamentals/index.html#second-order-tensors-4", - "href": "content/slides/fundamentals/index.html#second-order-tensors-4", + "objectID": "content/slides/introduction/index.html#lecture", + "href": "content/slides/introduction/index.html#lecture", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Second order tensors", - "text": "Second order tensors\nA skew symmetric tensor can furthermore always be expressed as a vector product, in the sense that there exist a \\(\\mathbf w\\), such that\n\\[\\mathbf W \\mathbf v = \\mathbf w \\times \\mathbf v\\]\n\\(\\mathbf w\\) is also denoted by \\(vec(\\mathbf W)\\) and referred to as the axial vector.\n\nRecall your background knowledge on the properties of second order tensors and their matrix representation:\n\ninvariants of a matrix / tensor, such as trace and determinant\neigensystem of a matrix / tensor including eigenvalue and eigenvector" + "section": "Lecture", + "text": "Lecture\nTarget audience:\n\nSimulation Sciences\nComputational Engineering Sciences\nComputer Science\n…\n\n\nRequired preliminary knowledge:\n\nCalculus and linear algebra\nBasic knowledge of numerical methods for partial differential equations, e.g. acquired through NumPDE\nBasic knowledge in fluidmechanics and thermodynamics is an advantage, but no must." }, { - "objectID": "content/slides/fundamentals/index.html#continuous-field", - "href": "content/slides/fundamentals/index.html#continuous-field", + "objectID": "content/slides/introduction/index.html#lecture-1", + "href": "content/slides/introduction/index.html#lecture-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Continuous field", - "text": "Continuous field\nUnder the continuum assumption, we can assume that we can describe the state of the system in terms of continuous fields. The fields are functions of position \\(\\mathbf x = (x,y,z)^T\\) and time \\(t\\).\nRelevant to this lecture will be: \\[\n\\begin{aligned}\n&\\rho(\\mathbf x,t) : \\text{density field (mass per unit volume)}\\\\\n&\\mathbf v (\\mathbf x,t) = (v_1(\\mathbf x,t),v_2(\\mathbf x,t),v_2(\\mathbf x,t))^T : \\text{velocity field}\\\\\n&p(\\mathbf x,t) : \\text{pressure field}\\\\\n&T(\\mathbf x,t) : \\text{temperature field }\\\\\n&\\mathbf \\sigma(\\mathbf x,t) : \\text{stress field}\\\\\n\\end{aligned}\n\\]\n\n\n\n\n\nRemark\n\n\nField relates to the fact that the variable is defined on some region \\(\\Omega\\). We discriminate\n\nscalar fields, e.g. density \\(\\rho:\\Omega \\times \\mathbb R^+ \\rightarrow \\mathbb R^+\\)\nvector fields, e.g. velocity \\(\\mathbf v:\\Omega \\times \\mathbb R^+ \\rightarrow \\mathbb R^d\\)\ntensor fields, e.g. stress tensor \\(\\mathbf \\sigma:\\Omega \\times \\mathbb R^+ \\rightarrow \\mathbb R^{d \\times d}\\)" + "section": "Lecture", + "text": "Lecture\nTime slots:\n\n🕣 Monday, 8:30 - 10:00, 📍 Eilfschornsteinstr. 18, Room 009\n🕣 Friday, 8:30 - 10:00, 📍 Eilfschornsteinstr. 18, Room 009\n\nSchedule is displayed on https://mbd.pages.rwth-aachen.de/courses/cmm/\n\n\n\n\n\n\n\nNote\n\n\nAny short notice changes will be communicated via moodle!" }, { - "objectID": "content/slides/fundamentals/index.html#element-in-a-vector-space-in-index-notation", - "href": "content/slides/fundamentals/index.html#element-in-a-vector-space-in-index-notation", + "objectID": "content/slides/introduction/index.html#exercises", + "href": "content/slides/introduction/index.html#exercises", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Element in a vector space in index notation", - "text": "Element in a vector space in index notation\nAs an element of a vector space, a vector can always be written in its basis:\n\\[\n\\mathbf{v} \\left( \\mathbf{x},t \\right) = u \\left( \\mathbf{x},t \\right) \\mathbf{e}_x + v \\left( \\mathbf{x},t \\right)\\mathbf{e}_y + w \\left( \\mathbf{x},t \\right) \\mathbf{e}_z\n\\]\nAlternatively, basis and vector components can be numbered, which yields\n\\[\n\\mathbf{v} = v_1 e_1 + v_2 e_2 + v_3 e_3 = \\sum_{i=1}^3 v_i e_i\n\\]\nIf an index appears twice in a term, summation is assumed, such that\n\\[\n\\mathbf{v} = \\sum_{i=1}^3 v_i e_i = v_i e_i \\quad \\text{and} \\quad \\mathbf{v} \\cdot \\mathbf{w} = v_i w_i\n\\]" + "section": "Exercises", + "text": "Exercises\nTime slots:\n\n🕣 Friday, 14:30 - 16:00, 📍 Eilfschornsteinstr. 18, Room 009\n\n\n\n\n\n\n\n\n\n\nFigure 1: Ingo Steldermann (steldermann@…)\n\n\n\n\n\n\n\n\n\n\nFigure 2: Benjamin Terschanski (terschanski@…)\n\n\n\n\n\n\n\n\n\n\nFigure 3: Alan Correa (correa@…)\n\n\n\n\n\nWeekly exercises will start this week\nStructure and assignment-based bonus point system will be introduced in the first exercise" }, { - "objectID": "content/slides/fundamentals/index.html#references", - "href": "content/slides/fundamentals/index.html#references", + "objectID": "content/slides/introduction/index.html#further-organization", + "href": "content/slides/introduction/index.html#further-organization", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "References", - "text": "References\n\n\n\n\nGonzalez, Oscar, and Andrew M. Stuart. 2001. A First Course in Continuum Mechanics. 1st ed. Cambridge University Press. https://www.cambridge.org/core/product/identifier/9780511619571/type/book." + "section": "Further organization", + "text": "Further organization\nExams\n\n🕣 05.08.2025, 09:00 – 11:00, 📍 (FT (2090|120) Melatener Str. 23-25, 1.Obergeschoß)\nBonus points via homeworks -> details will be provided during exercises\nOld exams can be found on our webpage -> note evolution of exam structure\n\n\nMaterial and resources:\n\nAnnouncements are sent out and archived via moodle!\nScript, slides and exercises will be made available via our lecture webpage:\n\nhttps://mbd.pages.rwth-aachen.de/courses/cmm/" }, { - "objectID": "content/slides/balance-laws/index.html#integral-continuity", - "href": "content/slides/balance-laws/index.html#integral-continuity", + "objectID": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology", + "href": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Integral continuity", - "text": "Integral continuity\nLet’s look at a specific quantity \\(\\Psi\\) in an arbitrary volume \\(\\mathcal C\\). We can think of it as mass per unit volume, or energy per unit volume, etc. Assuming continuity or local conservation means\n\n\\(\\Psi\\) can increase (decrease) according to influx (outflux) \\(\\mathbf F\\)\n\\(\\Psi\\) can increase (decrease) according to production (decay) \\(\\mathbf S\\)\nthere is no other mechanism\n\n\nTranslated into equations, this yields\n\\[\n\\begin{aligned}\n\\underbrace{\\frac{d}{dt} \\int_{\\mathcal C} \\Psi d \\mathbf x}_{ \\text{ rate of change of $\\Psi$ in $\\mathcal C$}} &= \\underbrace{- \\int_{\\partial \\mathcal C} \\mathbf F \\cdot \\mathbf n d \\mathbf \\sigma}_{ \\text{ in-/outflow across the surface (1.)}}\n+ \\underbrace{ \\int_{\\mathcal C} \\mathbf S d \\mathbf x}_{ \\text{ production/decay in (2.)}}\n\\end{aligned}\n\\]" + "section": "Simulation sciences are a key enabling technology", + "text": "Simulation sciences are a key enabling technology\nObjectives inherent to many societal challenges require fundamental understanding of the underlying physical processes, systems thinking, and advanced compute methods!\n\n\n\nFigure 4: Addressing societal challenges requires proficiency in simulation science and computational science and engineering" }, { - "objectID": "content/slides/balance-laws/index.html#divergence-theorem", - "href": "content/slides/balance-laws/index.html#divergence-theorem", + "objectID": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology-1", + "href": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Divergence theorem", - "text": "Divergence theorem\nApplying the so-called divergence theorem yields an integral formulation with only volume integrals \\[\n\\begin{aligned}\n\\frac{d}{dt} \\int_{\\mathcal C} \\Psi d \\mathbf x & = - \\int_{\\mathcal C} \\nabla \\cdot \\mathbf F d \\mathbf x + \\int_{\\mathcal C} \\mathbf S d \\mathbf x\n\\end{aligned}\n\\]\n\nand since \\(\\mathcal C\\) is an arbitrary control volume, we yield the strong formulation \\[\n\\begin{aligned}\n\\partial_t \\Psi & = - \\nabla \\cdot \\mathbf F + \\mathbf S\n\\end{aligned}\n\\]\n\n\nNote, that the time derivative now comes as a partial derivative, as \\(\\Psi\\) may vary with space, and \\(\\nabla\\) stands for the Hamilton vectorial operator “nabla”, in index notation \\(\\nabla = \\mathbf{e}_i \\partial_i\\), where \\[\n\\begin{aligned}\n\\nabla f = \\text{grad} f , \\quad\n\\nabla \\cdot f = \\text{div} f ,\\quad \\text{and} \\quad\n\\nabla \\times f = \\text{curl} f .\n\\end{aligned}\n\\]\nThe strong formulation also assumes differentiability of \\(\\Psi, \\mathbf F\\), and \\(\\mathbf S\\)." + "section": "Simulation sciences are a key enabling technology", + "text": "Simulation sciences are a key enabling technology\nObjectives inherent to many societal challenges require fundamental understanding of the underlying physical processes, systems thinking, and advanced compute methods!\n\n\n\nFigure 5: Addressing societal challenges requires proficiency in simulation science and computational science and engineering" }, { - "objectID": "content/slides/balance-laws/index.html#transport", - "href": "content/slides/balance-laws/index.html#transport", + "objectID": "content/slides/introduction/index.html#modeling-solid-liquid-phase-change-the-stefan-problem", + "href": "content/slides/introduction/index.html#modeling-solid-liquid-phase-change-the-stefan-problem", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Transport", - "text": "Transport\nThe two basic types of transport fluxes are:\n\nAdvective transport at velocity \\(\\mathbf v\\), hence \\(\\mathbf F = \\Psi \\mathbf v\\), and\nDiffusive transport with a diffusive flux \\(\\mathbf F = \\mathbf J\\), for instance given as gradient-driven transport \\(\\mathbf J = - D \\nabla \\Psi\\), in which \\(D\\) stands for the diffusion coefficient (Fourier’s law / Fick’s law)\n\nWe now get in operator notation:\n\\[\n\\begin{aligned}\n\\partial_t \\Psi + \\nabla \\cdot \\left( \\Psi \\mathbf v \\right) & = - \\nabla \\cdot \\mathbf J + S\n\\end{aligned}\n\\]\n\n\nIf \\(\\Psi\\) is a scalar then \\(\\nabla \\Psi\\) is a vector.\nThe diffusion coefficient can be a scalar \\(D\\) or a second order tensor \\(\\mathbf D\\) (anisotropic diffusion). Both \\(D \\nabla \\Psi\\) and \\(\\mathbf D \\nabla \\Psi\\) will be vectors.\nIn each case \\(\\nabla \\cdot D \\nabla \\Psi\\) and \\(\\nabla \\cdot \\mathbf D \\nabla \\Psi\\) will be a scalar again. It has the same dimension as \\(\\Psi\\)." + "section": "Modeling solid-liquid phase-change: The Stefan problem", + "text": "Modeling solid-liquid phase-change: The Stefan problem\n\n\nFigure 6: Milestone contribution to the modeling of phase-change processes due to Stefan, 1891" }, { - "objectID": "content/slides/balance-laws/index.html#notation-in-components", - "href": "content/slides/balance-laws/index.html#notation-in-components", + "objectID": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes", + "href": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Notation in components", - "text": "Notation in components\nIt is an informative exercise to spell out the generic balance law in components.\nFor a scalar specific quantity \\(\\Psi\\) and a scalar diffusion coefficient \\(D\\), the componentwise balance law reads:\n\\[\n\\begin{aligned}\n\\partial_t \\Psi \n&+ \\partial_x \\left( \\Psi v_x \\right)\n+ \\partial_y \\left( \\Psi v_y \\right)\n+ \\partial_z \\left( \\Psi v_z \\right) \\\\[1em]\n& = \\partial_x \\left( D \\partial_x \\Psi \\right)\n+ \\partial_y \\left( D \\partial_y \\Psi \\right)\n+ \\partial_z \\left( D \\partial_z \\Psi \\right)\n+ S\n\\end{aligned}\n\\]" + "section": "Stefan’s solution cannot capture all processes", + "text": "Stefan’s solution cannot capture all processes\n\n\n\nFigure 7: Measuring phase-change processes" }, { - "objectID": "content/slides/balance-laws/index.html#notation-in-components-1", - "href": "content/slides/balance-laws/index.html#notation-in-components-1", + "objectID": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-1", + "href": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Notation in components", - "text": "Notation in components\nDiffusion might differs with orientation. The diffusion coefficient is then given as a second order tensor. Hence\n\\[\n\\begin{aligned}\n\\mathbf D = \\left( \\begin{array}{ccc} d_{xx} & d_{xy} & d_{xz} \\\\ d_{yx} & d_{yy} & d_{yz} \\\\ d_{zx} & d_{zy} & d_{zz} \\end{array} \\right)\n\\Rightarrow\n\\mathbf D \\nabla \\Psi = \\left( \\begin{array}{ccc} d_{xx} \\partial_x \\Psi &+ d_{xy} \\partial_y \\Psi &+ d_{xz} \\partial_z \\Psi \\\\ d_{yx} \\partial_x \\Psi &+ d_{yy} \\partial_y \\Psi &+ d_{yz} \\partial_z \\Psi \\\\ d_{zx} \\partial_x \\Psi &+ d_{zy} \\partial_y \\Psi &+ d_{zz} \\partial_z \\Psi \\end{array} \\right)\n\\end{aligned}\n\\]\nIn this case, the balance law written in components reads\n\\[\n\\begin{aligned}\n\\partial_t \\Psi \n+ \\partial_x \\left( \\Psi v_x \\right)\n+ \\partial_y \\left( \\Psi v_y \\right)\n+ \\partial_z \\left( \\Psi v_z \\right) \n=\n\\partial_x & \\left( d_{xx} \\partial_x \\Psi\n+ d_{xy} \\partial_y \\Psi\n+ d_{xz} \\partial_z \\Psi \\right) \\\\\n+ \\partial_y & \\left( d_{yx} \\partial_x \\Psi\n+ d_{yy} \\partial_y \\Psi\n+ d_{yz} \\partial_z \\Psi \\right) \\\\\n+ \\partial_z & \\left( d_{zx} \\partial_x \\Psi\n+ d_{zy} \\partial_y \\Psi\n+ d_{zz} \\partial_z \\Psi \\right)\n+ S\n\\end{aligned}\n\\]\nIn index notation, finally, the (scalar) balance law can be written concicely as\n\\[\n\\begin{aligned}\n\\partial_t \\Psi + \\partial_i \\Psi v_i & = \\partial_i d_{ij} \\partial_j \\Psi + S\n\\end{aligned}\n\\]" + "section": "Stefan’s solution cannot capture all processes", + "text": "Stefan’s solution cannot capture all processes\n\n\nFigure 8: Measuring phase-change processes" }, { - "objectID": "content/slides/balance-laws/index.html#mass-balance", - "href": "content/slides/balance-laws/index.html#mass-balance", + "objectID": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-2", + "href": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-2", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Mass balance", - "text": "Mass balance\nWe consider as a specific, conserved quantity mass and accordingly choose\n\\[\\Psi = \\rho\\]\nhence mass per unit volume.\nIn addition, we choose\n\\[\n\\mathbf J = 0 \\quad \\text{and} \\quad \\mathbf S = 0.\n\\]\nThis yields the well known mass balance:\n\\[\n\\partial_t \\rho + \\nabla \\cdot \\left( \\rho \\mathbf v \\right) = 0\n\\]" + "section": "Stefan’s solution cannot capture all processes", + "text": "Stefan’s solution cannot capture all processes\nWe need to develop physics-based continuum mechanical computational models at a problem specific fidelity.\n\n\nFigure 9: Measuring phase-change processes" }, { - "objectID": "content/slides/balance-laws/index.html#momentum-balance", - "href": "content/slides/balance-laws/index.html#momentum-balance", + "objectID": "content/slides/introduction/index.html#what-is-a-model", + "href": "content/slides/introduction/index.html#what-is-a-model", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Momentum balance", - "text": "Momentum balance\nWe consider momentum as the conserved, specific quantity, hence\n\\[\n\\Psi = \\rho \\mathbf v\n\\] as momentum per unit volume.\nIn addition we set\n\\[\n\\mathbf J = \\mathbf \\sigma \\quad \\text{and} \\quad \\mathbf S = \\rho \\mathbf b,\n\\]\nin which \\(\\mathbf b\\) is a body force and \\(\\mathbf \\sigma\\) is the Cauchy stress tensor.\nIn our course the body force \\(\\mathbf b\\) is often given as the force due to gravitational acceleration denoted by \\(\\mathbf g\\)." + "section": "What is a model?", + "text": "What is a model?\nA model is a purposeful idealization and abstraction of our perception of reality.\n\n\n\n\n\n\n\n\n\n\nFigure 10: Idealization reduces complexity and facilitates feasibility.\n\n\n\n\n\n\n\n\n\n\nFigure 11: Abstraction reduces a complex system to its essential parts and facilitates transfer." }, { - "objectID": "content/slides/balance-laws/index.html#momentum-balance-1", - "href": "content/slides/balance-laws/index.html#momentum-balance-1", + "objectID": "content/slides/introduction/index.html#what-is-a-model-1", + "href": "content/slides/introduction/index.html#what-is-a-model-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Momentum balance", - "text": "Momentum balance\nAll in all, this yields the well known momentum balance:\n\\[\n\\partial_t ( \\rho \\mathbf v )\n+ \\nabla \\cdot \\left(\\rho \\mathbf v \\otimes \\mathbf v \\right) \n= \\nabla \\cdot \\mathbf \\sigma\n+ \\rho \\mathbf b\n\\]\nwith terms:\n\n\\(\\partial_t ( \\rho \\mathbf v )\\) : local change of momentum per unit volume\n\\(\\nabla \\cdot \\left( \\rho \\mathbf v \\otimes \\mathbf v \\right)\\) :influx/outflux of momentum into control volume due to advective transport\n\\(\\nabla \\cdot \\mathbf \\sigma\\) : force action of the ambient continuous medium through its boundary (examples: stretched rod, fluid at rest)\n\\(\\rho \\mathbf b\\) : total mass force acting on the medium, e.g. gravitational force" + "section": "What is a model?", + "text": "What is a model?\nIn simulation science and computational engineering, the purpose often implies an I/O character.\n\n\n\n\n\n\n\nFigure 12: Relevant models often have an I/O character" }, { - "objectID": "content/slides/balance-laws/index.html#momentum-balance-2", - "href": "content/slides/balance-laws/index.html#momentum-balance-2", + "objectID": "content/slides/introduction/index.html#computational-model-development-cycle", + "href": "content/slides/introduction/index.html#computational-model-development-cycle", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Momentum balance", - "text": "Momentum balance\nWe can use the mass balance to re-write momentum balance as\n\\[\n\\partial_t \\mathbf v + \\left( \\mathbf v \\cdot \\nabla \\right) \\mathbf v = \\tfrac{1}{\\rho} \\nabla \\cdot \\mathbf \\sigma + \\mathbf b\n\\]\nIdentifying the total derivative yields\n\\[\n\\frac{D}{Dt} \\mathbf v = \\tfrac{1}{\\rho} \\nabla \\cdot \\mathbf \\sigma + \\mathbf b,\n\\]\nwhich mimicks Newton’s second law." + "section": "Computational model development cycle", + "text": "Computational model development cycle\n\n\n\n\n\n\nFigure 13: Verification and Validation in CE" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", - "href": "content/slides/W_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", + "objectID": "content/slides/introduction/index.html#content-overview", + "href": "content/slides/introduction/index.html#content-overview", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "A seismic survey to investigate the subsurface", - "text": "A seismic survey to investigate the subsurface" + "section": "Content overview", + "text": "Content overview\n\nOverview of the lecture" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#how-to-simulate", - "href": "content/slides/W_linear_elasticity/index.html#how-to-simulate", + "objectID": "content/slides/introduction/index.html#references", + "href": "content/slides/introduction/index.html#references", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "How to simulate?", - "text": "How to simulate?\nThe simplest numerical solution of the wave equation\n\\[\\frac{\\partial^2}{\\partial t^2} \\mathbf w = c \\, \\frac{\\partial^2}{\\partial x^2} \\mathbf w\\]\nis done by means of finite difference approximations" + "section": "References", + "text": "References\n\nGonzalez and Stuart (2001)\n\n\n\n\n\nGonzalez, Oscar, and Andrew M. Stuart. 2001. A First Course in Continuum Mechanics. 1st ed. Cambridge University Press. https://www.cambridge.org/core/product/identifier/9780511619571/type/book." }, { - "objectID": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-1", - "href": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-1", + "objectID": "content/slides/derivatives-and-trajectories/index.html#gradient", + "href": "content/slides/derivatives-and-trajectories/index.html#gradient", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Simulation of a 1d wave propagation at wave speed 1", - "text": "Simulation of a 1d wave propagation at wave speed 1\n\n\n\n\n\n\n\n\n\nFigure 1: Space-time plot at wave speed 1" + "section": "Gradient", + "text": "Gradient\nThe gradient of a scalar field \\(\\phi: \\mathbb R^3 \\rightarrow \\mathbb R\\) is a vector field given by\n\\[ \\nabla \\phi (\\mathbf x) = \\frac{\\partial \\phi}{\\partial x_i} (\\mathbf x) \\mathbf e_i\\]\nThe gradient of a vector field \\(\\mathbf v: \\mathbb R^3 \\rightarrow \\mathbb R^3\\) is a second order tensor field given by\n\\[ \\nabla \\mathbf v (\\mathbf x) = \\frac{\\partial v_i}{\\partial x_j} (\\mathbf x) \\mathbf e_i \\otimes \\mathbf e_j\\]" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-0.5", - "href": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-0.5", + "objectID": "content/slides/derivatives-and-trajectories/index.html#divergence-and-laplacian", + "href": "content/slides/derivatives-and-trajectories/index.html#divergence-and-laplacian", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Simulation of a 1d wave propagation at wave speed 0.5", - "text": "Simulation of a 1d wave propagation at wave speed 0.5\n\n\n\n\n\n\n\n\n\nFigure 2: Space-time plot at wave speed 0.5" + "section": "Divergence and Laplacian", + "text": "Divergence and Laplacian\nThe divergence of a vector field \\(\\mathbf v: \\mathbb R^3 \\rightarrow \\mathbb R^3\\) is a scalar field given by\n\\[ \\nabla \\cdot \\mathbf v = tr( \\nabla \\mathbf v) \\qquad (\\nabla \\cdot \\mathbf v) (\\mathbf x) = \\frac{\\partial v_i}{\\partial x_i} (\\mathbf x) \\]\n\nThe Laplacians of a scalar field \\(\\phi: \\mathbb R^3 \\rightarrow \\mathbb R\\) and a vector field \\(\\mathbf v: \\mathbb R^3 \\rightarrow \\mathbb R^3\\) are defined as\n\\[ \\triangle \\phi = \\nabla \\cdot ( \\nabla \\phi) \\qquad \\triangle \\mathbf v = \\nabla \\cdot ( \\nabla \\mathbf v)\\]" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-a-1d-wave-propagation", - "href": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-a-1d-wave-propagation", + "objectID": "content/slides/derivatives-and-trajectories/index.html#eulerian-versus-lagrangian-reference", + "href": "content/slides/derivatives-and-trajectories/index.html#eulerian-versus-lagrangian-reference", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Animated simulation of a 1d wave propagation", - "text": "Animated simulation of a 1d wave propagation\n\n\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 3: Wave animation of wave with speed 1" + "section": "Eulerian versus Lagrangian reference", + "text": "Eulerian versus Lagrangian reference\nThe aforementioned form of the state variables is called the Eulerian formulation.\nIn contrast to this, we can look at a material particle initially located at \\(\\mathbf x_0\\) and track its trajectory during motion:\n\\[\n\\mathcal{\\mathbf X} (\\mathbf x_0;t), \\quad \\mathcal{\\mathbf X}:\\mathbb R^+ \\rightarrow \\mathbb R^3,\\quad \\text{with} \\quad \\mathcal{\\mathbf X} (\\mathbf x_0;t) = \\left(X_1(\\mathbf x_0;t),X_2(\\mathbf x_0;t),X_3(\\mathbf x_0;t) \\right)\n\\]\nHere, \\(\\mathbf x_0\\) denotes that the trajectory starts at \\(\\mathbf x_0\\) at time zero. It is, hence, no real space coordinate and can rather be seen as a parameter of \\(\\mathcal{\\mathbf X}\\).\nWe will therefore drop \\(\\mathbf x_0\\) for the rest of this section and refer to the trajectory as\n\\[\n\\mathcal{\\mathbf X} (t) = (X_1(t),X_2(t),X_3(t)).\n\\]" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-two-1d-superposed-waves", - "href": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-two-1d-superposed-waves", + "objectID": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-1", + "href": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Animated simulation of two 1d superposed waves", - "text": "Animated simulation of two 1d superposed waves\n\n\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 4: Wave animation at superposed waves with wave speed \\((1, 0.5)\\)" + "section": "Local, convective and material derivative", + "text": "Local, convective and material derivative\nTracking the evolution of the density along the trajectory of a fluid parcel, hence \\(\\rho(\\mathcal{\\mathbf X}(t),t)\\), or shorter \\(\\rho(\\mathcal{\\mathbf X},t)\\), is referred to as the density in Lagrangian formulation:\n\nLet’s look at the total density \\(\\rho(\\mathcal{\\mathbf X},t)\\) change along the trajectory:\n\\[\n\\begin{aligned}\n\\frac{d}{dt} \\rho(\\mathcal{\\mathbf X},t) &= \\frac{d}{dt} \\rho(X_1(t),X_2(t),X_3(t),t) \\\\[1em]\n& = \\underbrace{\\frac{d}{dt} X_1(t)}_{=v_1(\\mathbf x,t)} \\cdot \\partial_x \\rho\n+\\underbrace{\\frac{d}{dt} X_2(t)}_{=v_2(\\mathbf x,t)} \\cdot \\partial_y \\rho\n+\\underbrace{\\frac{d}{dt} X_3(t)}_{=v_3(\\mathbf x,t)} \\cdot \\partial_z \\rho\n+\\underbrace{\\frac{d}{dt} t}_{=1} \\cdot \\partial_t \\rho &\\\\[1em]\n& = \\partial_t \\rho + v_1 \\cdot \\partial_{x_1} \\rho + v_2 \\cdot \\partial_{x_2} \\rho + v_3 \\cdot \\partial_{x_3} \\rho\n= \\underbrace{\\underbrace{\\partial_t \\rho}_{\\text{local/time derivative}} + \\underbrace{ \\mathbf v \\cdot \\nabla \\rho }_{\\text{convective derivative}}}_{\\text{material/total derivative denoted by } \\frac{D}{Dt}}\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-1d-single-and-superposed-waves", - "href": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-1d-single-and-superposed-waves", + "objectID": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-2", + "href": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-2", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Animated simulation of 1d single and superposed waves", - "text": "Animated simulation of 1d single and superposed waves\n\n\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 5: Wave animation of single and superposed wave" + "section": "Local, convective and material derivative", + "text": "Local, convective and material derivative\nThe resulting relation between the total derivative and its local and convective counterparts reads:\n\\[\n\\begin{equation*}\n\\frac{D}{Dt} \\rho = \\partial_t \\rho + \\mathbf v \\cdot \\nabla \\rho\n\\end{equation*}\n\\]\n\nFor a vector field \\(\\mathbf v\\), we can do the same, which yields \\[\n\\frac{D}{Dt} \\mathbf v = \\partial_t \\mathbf v + \\mathbf v \\cdot \\nabla \\mathbf v\n\\]\nWritten componentwise this results in three equations \\[\n\\begin{aligned}\n\\frac{D}{Dt} u &= \\partial_t u + \\mathbf v \\cdot \\nabla u \\\\\n\\frac{D}{Dt} v &= \\partial_t v + \\mathbf v \\cdot \\nabla v \\\\\n\\frac{D}{Dt} w &= \\partial_t w + \\mathbf v \\cdot \\nabla w\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/W_linear_elasticity/index.html#references", - "href": "content/slides/W_linear_elasticity/index.html#references", + "objectID": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-3", + "href": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-3", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "References", - "text": "References" + "section": "Local, convective and material derivative", + "text": "Local, convective and material derivative\nFor an arbitrary field \\(\\phi\\), we have to distinguish\n\\[\n\\underbrace{\\frac{D}{Dt} \\phi = 0}_{\\phi \\text{ constant}} \\qquad \\text{or} \\qquad \\underbrace{\\partial_t \\phi = 0}_{\\phi \\text{ stationary}}\n\\]" }, { - "objectID": "content/slides/M_lubrication/index.html#towers-experiment", - "href": "content/slides/M_lubrication/index.html#towers-experiment", + "objectID": "content/slides/derivatives-and-trajectories/index.html#pathlines-or-trajectory", + "href": "content/slides/derivatives-and-trajectories/index.html#pathlines-or-trajectory", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Tower’s experiment", - "text": "Tower’s experiment\n\n\n\n\n\n\n\n\n\n\n\nSource: Hori (2006)\n\n\nObservations:\n\nFrictional resistance almost constant regardless the bearing load\nThe friction coefficient is very small, around 1/1000\nFrictional resistance increases with sliding speed\nFrictional resistance decreases with temperature" + "section": "Pathlines or trajectory", + "text": "Pathlines or trajectory\nThe actual physical motion of a fluid particle is describes by its trajectory or pathline defined as \\(\\mathcal{\\mathbf X} (t) = (X_1(t),X_2(t),X_3(t))\\). This corresponds to the Lagrangian formulation of the motion described before. A pathline is what you would see on a photo with a long exposure time when recording a moving object.\n\nPathline" }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing", + "objectID": "content/slides/derivatives-and-trajectories/index.html#pathlines", + "href": "content/slides/derivatives-and-trajectories/index.html#pathlines", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\n\n\n\n\n\nSource: By Wizard191 - Own work, CC BY-SA 3.0, Wiki commons: 10279899\n\n\nGiven:\n\nRadius of the bearing / journal\nProperties of the oil\nRotation speed / angular velocity\nForce / weight of the journal\n\nWanted:\n\nEccentricity of the journal\nOil film thickness\nPressure distribution" + "section": "Pathlines", + "text": "Pathlines\nGiven an initial position \\(\\mathbf{x}_0\\) at time \\(t=0\\), the pathline or trajectory \\(\\mathbf{X}(\\mathbf{x}_0; t)\\) can be determined from the following ordinary differential equation:\n\\[\n\\begin{eqnarray*}\n\\frac{d}{dt} \\mathbf{X}(t) &=& \\mathbf{v}(\\mathbf{X}(t),t) \\\\\n\\mathbf{X}(0) &=& \\mathbf{x}_0,\n\\end{eqnarray*}\n\\]\nin which \\(\\mathbf{x}_0\\) constitutes a parameter that denotes the dependence of the pathline or trajectory on the particle’s initial position." }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-1", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-1", + "objectID": "content/slides/derivatives-and-trajectories/index.html#streamline", + "href": "content/slides/derivatives-and-trajectories/index.html#streamline", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\n\nRadii \\(R_b\\) and \\(R_f\\)\nRadial clearance: \\(c = R_b - R_f\\)\nEccentricity \\(e\\), \\(k = \\frac{e}{c}\\)\nAngular / polar coordinate \\(x = R_b \\phi\\)\nOil film thickness: \\(h(\\phi) \\approx c + e \\cos (\\phi)\\)\nSommerfeld boundary conditions: \\(p(0)=p(2 \\pi) = 0\\)\nReynold’s equation\n\n\\[\n\\frac{d}{dx} \\left( h^3 \\frac{d}{dx} p \\right) = 6 \\mu U \\frac{d}{dx} h\n\\]\n\n\n\n\n\n\n\nSource: Hori (2006)" + "section": "Streamline", + "text": "Streamline\nThe streamline describes a curves, whose tangent vector constitutes the velocity at that location. An analogy would be iron filings in the vacinity of a bar magnet that orient themselves along the magnetic field lines.\n\nStreamline" }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-2", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-2", + "objectID": "content/slides/derivatives-and-trajectories/index.html#streamline-1", + "href": "content/slides/derivatives-and-trajectories/index.html#streamline-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nSommerfeld pressure distribution (\\(R_b \\approx R_f:= R\\)):\n\\[\np(k,\\phi) = \\frac{6 \\mu U R}{c^2} \\underbrace{\\frac{k ( 2 + k \\cos \\phi) \\sin \\phi}{(2+k^2)(1+k \\cos \\phi)^2}}_{\\bar p (k,\\phi)} = \\frac{6 \\mu U R}{c^2} \\bar p (k,\\phi)\n\\]\n\n\n\n\n\n\n\n\n\n\n\n\nSource: Hori (2006)" + "section": "Streamline", + "text": "Streamline\nPer its definition, the streamline \\(\\frac{d}{ds} \\mathbf{\\hat{X}}(s)\\) has to be tangent to the velocity field \\(\\mathbf{v}\\) at every point in space for a given time. It is defined as\n\\[\n\\begin{eqnarray}\n\\frac{d}{ds} \\mathbf{\\hat X}(s) = \\alpha \\mathbf{v}( \\mathbf{\\hat X}(s),t^*).\n\\end{eqnarray}\n\\]\nwith \\(\\alpha \\in \\mathbb R \\setminus \\{0\\}\\).\nThis definition automatically fullfills the required condition: \\[\n\\begin{aligned}\n\\frac{d}{ds} \\mathbf{\\hat X}(s) \\times \\frac{d}{ds} \\mathbf{\\hat X}(s) & = \\alpha \\mathbf{v}(\\mathbf{\\hat X}(s),t^*) \\times \\frac{d}{ds} \\mathbf{\\hat X}(s) = 0.\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-3", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-3", + "objectID": "content/slides/derivatives-and-trajectories/index.html#streakline", + "href": "content/slides/derivatives-and-trajectories/index.html#streakline", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nThe hydrodynamic oil film force \\(P\\) has to balance the bearing load \\(P_1\\)\nThis gives rise to the following componentwise force balance relations in eccentricity direction and perpendicular to it:\n\\[\nL R \\int_0^{2 \\pi} p(k,\\phi) \\cos \\phi d \\phi + P_1 \\cos \\theta = 0\n\\]\n\\[\nL R \\int_0^{2 \\pi} p(k,\\phi) \\sin \\phi d \\phi - P_1 \\sin \\theta = 0\n\\]\nin which \\(L\\) denotes the length of the bearing.\n\n\n\n\n\n\n\nSource: Hori (2006)" + "section": "Streakline", + "text": "Streakline\nA streakline, finally describes the set of all points that have passed through a particular point \\(\\mathbf{x}_0\\) in the past. A typical example is given by a visualization in response to a continuously released tracer, such as ink in a water flow, or smoke in a wind tunnel.\n\nStreakline" }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-4", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-4", + "objectID": "content/slides/derivatives-and-trajectories/index.html#streakline-1", + "href": "content/slides/derivatives-and-trajectories/index.html#streakline-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nThe hydrodynamic oil film force \\(P\\) has to balance the bearing load \\(P_1\\)\nThis gives rise to the following componentwise force balance relations in eccentricity direction and perpendicular to it:\n\\[\n\\underbrace{L R \\int_0^{2 \\pi} p(k,\\phi) \\cos \\phi d \\phi}_{=0} + P_1 \\cos \\theta = 0\n\\]\nThis means\n\\[\nP_1 \\cos \\theta = 0 \\quad \\Rightarrow \\theta = \\frac{\\pi}{2}\n\\]\n\n\n\n\n\n\n\nSource: Hori (2006)" + "section": "Streakline", + "text": "Streakline\nAssuming a location \\(\\mathbf{x}_0\\) to be given, the streakline \\(\\mathbf{\\widetilde{X}}(\\mathbf{x}_0, \\tau_0; \\tau)\\) is defined as\n\\[\n\\begin{eqnarray}\n\\frac{d}{d\\tau} \\mathbf{\\widetilde{X}(\\tau)} &=& \\mathbf{v}(\\mathbf{\\widetilde{X}(\\tau)}, \\tau_0 + \\tau) \\\\\n\\widetilde{\\mathbf{X}}(0) &=& \\mathbf{x}_0\n\\end{eqnarray}\n\\]\nNote, that the start time (of the injection) \\(\\tau_0\\) might varies for each particle." }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-5", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-5", + "objectID": "content/slides/derivatives-and-trajectories/index.html#interactive-plot", + "href": "content/slides/derivatives-and-trajectories/index.html#interactive-plot", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nThe hydrodynamic oil film force \\(P\\) has to balance the bearing load \\(P_1\\)\nThis gives rise to the following componentwise force balance relations in eccentricity direction and perpendicular to it:\n\\[\nL R \\int_0^{2 \\pi} p(k,\\phi) \\sin \\phi d \\phi - P_1 \\sin \\theta = 0\n\\]\n\\[\n\\Rightarrow P_1 = \\mu U L \\left( \\frac{R}{c} \\right)^2 \\frac{12 \\pi k}{(2 + k^2) (1 - k^2)^{1/2}}\n\\]\n\n\n\n\n\n\n\nSource: Hori (2006)" + "section": "Interactive plot", + "text": "Interactive plot" }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-6", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-6", + "objectID": "content/slides/W_linear_elasticity/wave_equation.html", + "href": "content/slides/W_linear_elasticity/wave_equation.html", + "title": "Linear elasticity", + "section": "", + "text": "\\[\\frac{\\partial^2}{\\partial t^2} \\mathbf w = c \\, \\frac{\\partial^2}{\\partial x^2} \\mathbf w\\]\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\n\n%matplotlib inline\n\n\nNumerical solver based on finite differencing strategy:\n\n\ndef solve_wave_equation(c, L, T, dx, dt, initial_condition):\n \n # check stability\n if c * dt / dx > 1:\n raise ValueError(\"Stability condition violated: c*dt/dx should be <= 1\")\n \n # discretize space-time domain\n x = np.arange(0, L + dx, dx)\n t = np.arange(0, T + dt, dt)\n u = np.zeros((len(t), len(x)))\n \n # set initial condition\n u[0, :] = initial_condition(x)\n if len(t) > 1:\n u[1, :] = u[0, :] \n \n # buffer coefficient \n C2 = (c * dt / dx)**2\n \n # time update\n for n in range(1, len(t) - 1):\n for i in range(1, len(x) - 1):\n u[n + 1, i] = (2 * u[n, i] - u[n - 1, i] + C2 * (u[n, i + 1] - 2 * u[n, i] + u[n, i - 1]))\n \n # set boundary condition\n u[:, 0] = 0\n u[:, -1] = 0\n \n return x, t, u\n\n\nSet up simulation scenario\n\n\n# Initial condition: Gaussian bump\ndef initial_gaussian_pulse(x, sigma=0.1, mu=0.5):\n return np.exp(-((x - mu) / sigma)**2)\n\n# Scenario parameters\nsigma = 0.25 # IC dev\nmu = 0.5 # IC center\nc = 1.0 # Wave speed\nT = 2.0 # Total time\nL = 1.0 # Domain size\ndx = 0.01 \ndt = 0.005\n\n\nDeploy scenario 1 and 2\n\n\n# Run simulation\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 1: Space-time plot at wave speed 1\n\n\n\n\n\n\n# Run simulation\nc = 0.5\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 2: Space-time plot at wave speed 0.5\n\n\n\n\n\n\nAnimate result\n\n\n%%capture\n# Run simulation\nc = 1.0\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagation.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 3: Wave animation of wave with speed 1\n\n\n\n\n\n# Run simulation\nc1 = 1.0\nc2 = 0.5\nx, t, u1 = solve_wave_equation(c1, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\nx, t, u2 = solve_wave_equation(c2, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\n# fig, ax = plt.subplots(figsize=(10,8))\nplt.imshow(u1+u2, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 4: Space-time plot for two superposed waves\n\n\n\n\n\n\n%%capture\n\nu_superposed = 0.5*(u1 + u2)\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'b-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationSuperposed.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 5: Wave animation at superposed waves with wave speed \\((1, 0.5)\\)\n\n\n\n\n\n%%capture\n\n\ndef animate_wave(x, u, u_superposed, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-', label='single wave')\n line2, = ax.plot(x, u_superposed[0, :], 'b-', label='superposed wave')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n plt.legend()\n\n def update(frame):\n line.set_ydata(u[frame, :])\n line2.set_ydata(u_superposed[frame, :])\n return line, line2\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationBoth.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 6: Wave animation of single and superposed wave" + }, + { + "objectID": "content/slides/W_linear_elasticity/wave_equation.html#d-wave-equation", + "href": "content/slides/W_linear_elasticity/wave_equation.html#d-wave-equation", + "title": "Linear elasticity", + "section": "", + "text": "\\[\\frac{\\partial^2}{\\partial t^2} \\mathbf w = c \\, \\frac{\\partial^2}{\\partial x^2} \\mathbf w\\]\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\n\n%matplotlib inline\n\n\nNumerical solver based on finite differencing strategy:\n\n\ndef solve_wave_equation(c, L, T, dx, dt, initial_condition):\n \n # check stability\n if c * dt / dx > 1:\n raise ValueError(\"Stability condition violated: c*dt/dx should be <= 1\")\n \n # discretize space-time domain\n x = np.arange(0, L + dx, dx)\n t = np.arange(0, T + dt, dt)\n u = np.zeros((len(t), len(x)))\n \n # set initial condition\n u[0, :] = initial_condition(x)\n if len(t) > 1:\n u[1, :] = u[0, :] \n \n # buffer coefficient \n C2 = (c * dt / dx)**2\n \n # time update\n for n in range(1, len(t) - 1):\n for i in range(1, len(x) - 1):\n u[n + 1, i] = (2 * u[n, i] - u[n - 1, i] + C2 * (u[n, i + 1] - 2 * u[n, i] + u[n, i - 1]))\n \n # set boundary condition\n u[:, 0] = 0\n u[:, -1] = 0\n \n return x, t, u\n\n\nSet up simulation scenario\n\n\n# Initial condition: Gaussian bump\ndef initial_gaussian_pulse(x, sigma=0.1, mu=0.5):\n return np.exp(-((x - mu) / sigma)**2)\n\n# Scenario parameters\nsigma = 0.25 # IC dev\nmu = 0.5 # IC center\nc = 1.0 # Wave speed\nT = 2.0 # Total time\nL = 1.0 # Domain size\ndx = 0.01 \ndt = 0.005\n\n\nDeploy scenario 1 and 2\n\n\n# Run simulation\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 1: Space-time plot at wave speed 1\n\n\n\n\n\n\n# Run simulation\nc = 0.5\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 2: Space-time plot at wave speed 0.5\n\n\n\n\n\n\nAnimate result\n\n\n%%capture\n# Run simulation\nc = 1.0\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagation.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 3: Wave animation of wave with speed 1\n\n\n\n\n\n# Run simulation\nc1 = 1.0\nc2 = 0.5\nx, t, u1 = solve_wave_equation(c1, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\nx, t, u2 = solve_wave_equation(c2, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\n# fig, ax = plt.subplots(figsize=(10,8))\nplt.imshow(u1+u2, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 4: Space-time plot for two superposed waves\n\n\n\n\n\n\n%%capture\n\nu_superposed = 0.5*(u1 + u2)\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'b-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationSuperposed.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 5: Wave animation at superposed waves with wave speed \\((1, 0.5)\\)\n\n\n\n\n\n%%capture\n\n\ndef animate_wave(x, u, u_superposed, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-', label='single wave')\n line2, = ax.plot(x, u_superposed[0, :], 'b-', label='superposed wave')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n plt.legend()\n\n def update(frame):\n line.set_ydata(u[frame, :])\n line2.set_ydata(u_superposed[frame, :])\n return line, line2\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationBoth.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 6: Wave animation of single and superposed wave" + }, + { + "objectID": "content/slides/M_porous_media/index.html#flow-through-porous-media-is-governed-by-darcys-law", + "href": "content/slides/M_porous_media/index.html#flow-through-porous-media-is-governed-by-darcys-law", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nIntroducing the Sommerfeld Number\n\\[\nS:= \\frac{\\mu N}{p_m} \\left( \\frac{R}{c} \\right)^2\n\\]\nin terms of bearing pressure \\(p_m:= P_1 / (2 R L)\\) and number of revolutions \\(N := U/(2 \\pi R)\\).\nWe get\n\\[\n\\frac{1}{S} = \\frac{12 \\pi k}{(2 + k^2) (1 - k^2)^{1/2}}\n\\]\nJournal bearings with similar Sommerfeld Number \\(S\\) operate under similar conditions!" + "section": "Flow through porous media is governed by Darcy’s law", + "text": "Flow through porous media is governed by Darcy’s law\n \nSource left: https://serc.carleton.edu/integrate/teaching_materials/water_science_society/student_materials/926 Source right: https://pressbooks.cuny.edu/gorokhovich/chapter/porosity-and-permeability-darcy-law/" }, { - "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-7", - "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-7", + "objectID": "content/slides/M_porous_media/index.html#needed-technique-to-determine-macroscale-process", + "href": "content/slides/M_porous_media/index.html#needed-technique-to-determine-macroscale-process", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lubrication in a journal bearing", - "text": "Lubrication in a journal bearing\n\n\n\n\n\n\n\n\n\n\n\nSource: By Wizard191 - Own work, CC BY-SA 3.0, Wiki commons: 10279899\n\n\nGiven:\n\nRadius of the bearing / journal \\(R,c\\)\nProperties of the oil \\(\\mu\\)\nRotation speed / angular velocity \\(N\\)\nForce / weight of the journal \\(P_1\\)\n\\(S:= \\frac{\\mu N}{p_m} \\left( \\frac{R}{c} \\right)^2\\)\n\nWanted:\n\nEccentricity: Sommerfeld solution!\nOil film thickness: Ansatz\nPressure distribution: Reynolds equation" + "section": "Needed: Technique to determine macroscale process", + "text": "Needed: Technique to determine macroscale process\n \nSource left: Cross-section through a fiber-reinforced composite with two orientations\n(University of Augsburg)" }, { - "objectID": "content/slides/M_lubrication/index.html#references", - "href": "content/slides/M_lubrication/index.html#references", + "objectID": "content/slides/M_porous_media/index.html#lets-start-simple-solve-directly", + "href": "content/slides/M_porous_media/index.html#lets-start-simple-solve-directly", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "References", - "text": "References\n\n\n\n\nHori, Y. 2006. “Hydrodynamic Lubrication.”" + "section": "Let’s start simple: Solve directly", + "text": "Let’s start simple: Solve directly\n\n\n\n\n\nStationary diffusion at fixed boundary conditions:\n\\[\n\\begin{aligned}\n \\frac{d}{dx} \\left( a^\\epsilon(x) \\frac{d}{dx} u^\\epsilon (x) \\right) & = 0 \\qquad \\text{for} \\quad 0 \\leq x \\leq L\n\\end{aligned}\n\\]\nwith an oscillating model parameter\n\\[\n\\begin{aligned}\n a^\\epsilon(x) &= \\frac{1}{1 + 2 \\sin^2 (\\pi x / \\epsilon)}\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/index-student.html", - "href": "content/slides/index-student.html", - "title": "Slides", + "objectID": "content/slides/M_porous_media/index.html#consider-the-properties-of-the-parameter", + "href": "content/slides/M_porous_media/index.html#consider-the-properties-of-the-parameter", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Consider the properties of the parameter", + "text": "Consider the properties of the parameter\n\n\n\n\n\nWe are interested in the limit \\(\\epsilon \\Rightarrow 0\\)!\nChallenge: The parameter does not converge (pointwise)!" + }, + { + "objectID": "content/slides/M_porous_media/index.html#solution-solve-for-a-sequence-of-parameters", + "href": "content/slides/M_porous_media/index.html#solution-solve-for-a-sequence-of-parameters", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Solution: Solve for a sequence of parameters", + "text": "Solution: Solve for a sequence of parameters\n\n\n\n\n\nObservation: The numerical solution seems to converge!\nWe postulate \\(\\lim_{\\epsilon \\rightarrow 0} u^\\epsilon (x) = x\\)!" + }, + { + "objectID": "content/slides/M_porous_media/index.html#mathematical-homogenization", + "href": "content/slides/M_porous_media/index.html#mathematical-homogenization", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Mathematical homogenization", + "text": "Mathematical homogenization\nIdea 1: Identify macro-scale \\(L\\), micro-scale \\(l\\) and introduce scaling\n\\[\n\\begin{equation*}\ny := \\frac{L}{l} x = \\frac{x}{\\epsilon} \\qquad \\text{in which} \\quad \\epsilon := \\frac{l}{L}\n\\end{equation*}\n\\]\nIdea 2: Interpret functions as two-scale and make asymptotic expansion Ansatz:\n\\[\n\\begin{equation*}\nf^\\epsilon = f(x,y) = \\sum_{i=0}^n \\epsilon^i f^{(i)}(x,y) = f^{(0)}(x,y) + \\epsilon^1 f^{(1)}(x,y) + \\epsilon^2 f^{(2)}(x,y) + \\mathcal O (\\epsilon^3)\n\\end{equation*}\n\\]\nDifferentiation with respect to \\(x\\) then translates according to:\n\\[\n\\begin{aligned}\n\\frac{d}{dx} u(x,y) &= \\frac{d}{dx} u\\left(x,y(x)\\right) \\\\\n&= \\partial_x u(x,y) + \\partial_y u(x,y) \\underbrace{\\frac{d}{dx}y(x)}_{= \\epsilon^{-1}}\n= \\partial_x u + \\epsilon^{-1} \\partial_y u\n\\end{aligned}\n\\]" + }, + { + "objectID": "content/slides/M_porous_media/index.html#mathematical-homogenization-1", + "href": "content/slides/M_porous_media/index.html#mathematical-homogenization-1", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Mathematical homogenization", + "text": "Mathematical homogenization\nSubstitution yields\n\\[\n\\begin{align*}\n& \\quad \\frac{d}{dx} \\left( a(y) \\frac{d}{dx} \\left(u^{(0)} + \\epsilon u^{(1)} + \\epsilon^2 u^{(2)}\\right) \\right) \\\\\n& = \\frac{d}{dx} \\left( a(y) \\left(\\partial_x u^{(0)} + \\epsilon^{-1} \\partial_y u^{(0)} + \\epsilon \\partial_x u^{(1)} + \\partial_y u^{(1)} + \\epsilon^2 \\partial_x u^{(2)} + \\epsilon \\partial_y u^{(2)}\\right) \\right)\\\\\n% first line\n& = \\underbrace{\\partial_x \\left( a(y) \\, \\partial_x u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^0} +\n\\underbrace{\\epsilon^{-1}\\,\\partial_y \\left( a(y) \\, \\partial_x u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^{-1}} +\n\\underbrace{\\epsilon^{-1}\\,\\partial_x \\left( a(y) \\, \\partial_y u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^{-1}} +\n\\underbrace{\\epsilon^{-2}\\,\\partial_y \\left( a(y) \\, \\partial_y u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^{-2}} +\\\\\n% second line\n& + \\underbrace{\\epsilon \\, \\partial_x \\left( a(y) \\, \\partial_x u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^1} +\n\\underbrace{\\partial_y \\left( a(y) \\, \\partial_x u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^{0}} +\n\\underbrace{\\partial_x \\left( a(y) \\, \\partial_y u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^{0}} +\n\\underbrace{\\epsilon^{-1}\\,\\partial_y \\left( a(y) \\, \\partial_y u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^{-1}} +\\\\\n% third line\n& + \\underbrace{\\epsilon^2 \\, \\partial_x \\left( a(y) \\, \\partial_x u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^2} +\n\\underbrace{\\epsilon \\,\\partial_y \\left( a(y) \\, \\partial_x u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^{1}} +\n\\underbrace{\\epsilon \\,\\partial_x \\left( a(y) \\, \\partial_y u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^{1}} +\n\\underbrace{\\partial_y \\left( a(y) \\, \\partial_y u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^{0}} +\n\\end{align*}\n\\]" + }, + { + "objectID": "content/slides/M_porous_media/index.html#mathematical-homogenization-2", + "href": "content/slides/M_porous_media/index.html#mathematical-homogenization-2", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Mathematical homogenization", + "text": "Mathematical homogenization\nRe-ordering in powers of \\(\\epsilon\\) yields\n\\[\n\\begin{align*}\n\\mathcal O \\left(\\epsilon^{-2}\\right): \\quad &\\partial_y \\left( a(y) \\, \\partial_y u^{(0)} \\right) = 0 \\\\\n\\mathcal O \\left(\\epsilon^{-1}\\right): \\quad &\\partial_x \\left( a(y) \\, \\partial_y u^{(0)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_x u^{(0)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_y u^{(1)} \\right) = 0\\\\\n\\mathcal O \\left(\\epsilon^{0}\\right): \\quad &\\partial_x \\left( a(y) \\, \\partial_x u^{(0)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_x u^{(1)} \\right) +\n\\partial_x \\left( a(y) \\, \\partial_y u^{(1)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_y u^{(2)} \\right) = 0\\\\\n\\mathcal O \\left(\\epsilon^{1}\\right): \\quad &\\partial_x \\left( a(y) \\, \\partial_x u^{(1)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_x u^{(2)} \\right) +\n\\partial_x \\left( a(y) \\, \\partial_y u^{(2)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_y u^{(3)} \\right) = 0\n\\end{align*}\n\\]\nBoundary conditions on both scales are\n\\[\n\\begin{align*}\n&u^{(0)} (0,y) = 0 \\qquad u^{(0)} (1,y) = 1 \\\\\n&u^{(i)} (0,y) = 0 \\qquad u^{(i)} (1,y) = 0 \\qquad &\\text{for all} \\; i \\geq 1 \\\\\n&u^{(i)} (x,0) = u^{(i)} (x,1) \\qquad &\\text{for all} \\; i \\geq 0 \\\\\n&\\partial_y u^{(i)} (0,y) = \\partial_y u^{(i)} (1,y) = 0 \\qquad &\\text{for all} \\; i \\geq 0\n\\end{align*}\n\\]" + }, + { + "objectID": "content/slides/M_porous_media/index.html#solve-step-by-step", + "href": "content/slides/M_porous_media/index.html#solve-step-by-step", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Solve step by step", + "text": "Solve step by step\nStep 1: We observe that \\(u^{(0)}\\) independent of \\(y\\) is a solution to the largest scale:\n\\[\nu^{(0)}(x,y) = u^{(0)}(x)\n\\]\nStep 2: Substituting the latter into the \\(\\epsilon^{-1}\\) yields \\[\n\\begin{align*}\n \\underbrace{\\partial_y \\left( a(y) \\, \\partial_x u^{(0)} \\right)}_{\\left( \\partial_y a(y) \\right) \\partial_x u^{(0)} +\n \\underbrace{a(y) \\partial_{yx} u^{(0)}}_{=0}} +\n \\partial_y \\left( a(y) \\, \\partial_y u^{(1)} \\right) = 0.\n\\end{align*}\n\\]\nNote, that with \\(u^{(1)}\\) defined according to \\[\n\\begin{align*}\nu^{(1)}(x,y) = \\left( \\frac{\\int_0^y \\frac{1}{a(\\tilde y)} d\\tilde y}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} - y + c\\right) \\partial_x u^{(0)} + f(x)\n\\end{align*}\n\\]\nthis equation is fulfilled." + }, + { + "objectID": "content/slides/M_porous_media/index.html#solve-step-by-step-1", + "href": "content/slides/M_porous_media/index.html#solve-step-by-step-1", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Solve step by step", + "text": "Solve step by step\nStep 3: Integrate the \\(\\epsilon\\) scale over a periodic cell \\(Y\\): \\[\n\\begin{align*}\n& \\int_0^1 \\partial_x \\left( a(y) \\partial_x u^{(0)} \\right) d y +\n\\underbrace{\\int_0^1 \\partial_y \\left( a(y) \\, \\partial_x u^{(1)} \\right) d y}_{[a(y) \\partial_x u^{(1)}]_0^1 = 0} \\\\\n& + \\int_0^1 \\partial_x \\left( a(y) \\partial_y u^{(1)} \\right) d y +\n\\underbrace{\\int_0^1 \\partial_y \\left( a(y) \\partial_y u^{(2)} \\right) d y}_{[a(y) \\partial_y u^{(2)}]_0^1 = 0}\n\\end{align*}\n\\]\nwhere we observe several terms to cancel out due to the micro-scale periodicity.The following two terms remain: \\[\n\\begin{align*}\n\\int_0^1 \\partial_x \\left( a(y) \\partial_x u^{(0)} \\right) + \\partial_x \\left( a(y) \\partial_y u^{(1)} \\right) d y\n\\end{align*}\n\\]" + }, + { + "objectID": "content/slides/M_porous_media/index.html#solve-step-by-step-2", + "href": "content/slides/M_porous_media/index.html#solve-step-by-step-2", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Solve step by step", + "text": "Solve step by step\nSubstituting in \\(u^{(1)}\\) as defined before finally yields\n\\[\n\\begin{align*}\n& \\int_0^1 \\partial_x \\left( a(y) \\partial_x u^{(0)} \\right) + \\partial_x \\left( a(y) \\left( \\left( \\frac{\\frac{1}{a( y)}}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} - 1 \\right) \\partial_x u^{(0)} \\right) \\right) d y \\\\\n= & \\int_0^1 \\partial_x \\left( \\frac{1}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} \\partial_x u^{(0)} \\right) d y =\n\\partial_x \\left(\\underbrace{\\int_0^1 \\frac{1}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} d y }_{=:a^{(0)}}\\right) \\partial_x u^{(0)} \\\\\n= & \\frac{d}{dx} \\left( a^{(0)} \\frac{d}{dx} u^{(0)} \\right).\n\\end{align*}\n\\]" + }, + { + "objectID": "content/slides/M_porous_media/index.html#solution", + "href": "content/slides/M_porous_media/index.html#solution", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Solution", + "text": "Solution\nFor our particular example, we get \\(\\int_0^1 \\frac{1}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} d y = \\frac{1}{2}\\)\nand hence\n\\[\n\\begin{align*}\nu^{(0)} = x \\qquad \\text{and} \\qquad u^{(1)} = - \\frac{1}{ 4 \\pi} \\sin \\left( 2 \\pi y \\right).\n\\end{align*}\n\\]\nThe complete solution reads \\[\n\\begin{align*}\nu(x,y) = u^{(0)} + \\epsilon u^{(1)} = x - \\frac{\\epsilon}{ 4 \\pi} \\sin \\left( 2 \\pi y \\right)\n\\end{align*}\n\\]\nand we indeed see that \\[\n\\begin{align*}\n\\underset{\\epsilon \\to 0}{\\lim} \\, u(x,y) = x,\n\\end{align*}\n\\]\nas we initially postulated!" + }, + { + "objectID": "content/slides/M_porous_media/index.html#homogenized-solution", + "href": "content/slides/M_porous_media/index.html#homogenized-solution", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Homogenized solution", + "text": "Homogenized solution\n\n\n\n\n\nHomogenized solution corresponds to direct solution!\nPostulated \\(\\lim_{\\epsilon \\rightarrow 0} u^\\epsilon (x) = x\\) has been proven!" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", + "href": "content/slides/M_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "A seismic survey to investigate the subsurface", + "text": "A seismic survey to investigate the subsurface\n\n\n\n\n\n\nBoxberg (2023)" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#how-do-we-get-information-on-relevant-material-properties", + "href": "content/slides/M_linear_elasticity/index.html#how-do-we-get-information-on-relevant-material-properties", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "How do we get information on relevant material properties?", + "text": "How do we get information on relevant material properties?\n\n\n\n\n\n\nBoxberg (2023)" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#what-does-the-detected-signal-tell-us", + "href": "content/slides/M_linear_elasticity/index.html#what-does-the-detected-signal-tell-us", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "What does the detected signal tell us?", + "text": "What does the detected signal tell us?\n\n\n\n\n\n\nBoxberg (2023)" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#how-does-the-simulation-compare", + "href": "content/slides/M_linear_elasticity/index.html#how-does-the-simulation-compare", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "How does the simulation compare?", + "text": "How does the simulation compare?\n\n\n\n\n\n\nBoxberg (2023)" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation", + "href": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Deep-dive into the simulated wave propagation", + "text": "Deep-dive into the simulated wave propagation\n\n\n\n\n\n\nBoxberg (2023)" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation-1", + "href": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation-1", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Deep-dive into the simulated wave propagation", + "text": "Deep-dive into the simulated wave propagation\n\n\n\n\n\n\nBoxberg (2023)" + }, + { + "objectID": "content/slides/M_linear_elasticity/index.html#reference", + "href": "content/slides/M_linear_elasticity/index.html#reference", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Reference", + "text": "Reference\n\n\n\n\nBoxberg, Marc S. 2023. “Wave Propagation in Lab Experiment, Boxberg@gim.rwth-Aachen.de.”" + }, + { + "objectID": "content/wiki/index.html", + "href": "content/wiki/index.html", + "title": "Wiki", "section": "", - "text": "Order By\n Default\n \n Date - Oldest\n \n \n Date - Newest\n \n \n Title\n \n \n Author\n \n \n \n \n \n \n \n\n\n\n\n\nDate\n\n\nTitle\n\n\nAuthor\n\n\n\n\n\n\n2025 04 07\n\n\nIntroduction\n\n\nJulia Kowalski\n\n\n\n\n2025 04 11\n\n\nFundamentals\n\n\nJulia Kowalski\n\n\n\n\n2025 04 14\n\n\nDerivatives and trajectories\n\n\nJulia Kowalski\n\n\n\n\n2025 04 14\n\n\nBalance laws\n\n\nJulia Kowalski\n\n\n\n\n\nNo matching items" + "text": "Your browser might not show the updated content of the webpage by default. Please ensure that you empty the cache for this webpage before using it. Potential keyboard shortcuts for:\n\nGoogle Chrome/Firefox: CTRL + F5.\nSafari (11.1 and above): CTRL + OPTION + F5\nMirosoft Edge: CTRL + F5", + "crumbs": [ + "Wiki" + ] }, { - "objectID": "content/wiki/how_to_homework.html", - "href": "content/wiki/how_to_homework.html", - "title": "Work you your homework in the RWTH Cluster", + "objectID": "content/wiki/index.html#faq", + "href": "content/wiki/index.html#faq", + "title": "Wiki", "section": "", - "text": "Make sure you have an HPC Account\nIf you want to work from home, you need connect to the RWTH VPN\n\n\n\n\n\nLog into the Cluster\nHow to add your SSH keys for a more convenient login\nNote that there are multiple login nodes to the RWTH Cluster.\n\n\n\n\nYou need to be in the network of RWTH. Use VPN if necessary.\n\n\nIn your browser, open\nhttps://login23-x-1.hpc.itc.rwth-aachen.de:3300/auth/ssh/\nand log into the cluster.\n\nCreate a session, e.g. MATE (us)\n\n\n\n(optional) You may want to download the Desktop Clients instead of using your browser.\n\n\n\n\n\n\nOpen a terminal\nDownload the Container (Apptainer) of our course, e.g.\n\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nls\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nOpen firefox\nStart a Jupyter server with\n\napptainer run dolfinx_latest.sif notebook\n\nClick the link or copy it to your browser\n\n\n\n\ncrea" + "text": "Your browser might not show the updated content of the webpage by default. Please ensure that you empty the cache for this webpage before using it. Potential keyboard shortcuts for:\n\nGoogle Chrome/Firefox: CTRL + F5.\nSafari (11.1 and above): CTRL + OPTION + F5\nMirosoft Edge: CTRL + F5", + "crumbs": [ + "Wiki" + ] }, { - "objectID": "content/wiki/how_to_homework.html#prerequisites", - "href": "content/wiki/how_to_homework.html#prerequisites", - "title": "Work you your homework in the RWTH Cluster", + "objectID": "content/wiki/authoring.html", + "href": "content/wiki/authoring.html", + "title": "Lecturer FAQ", "section": "", - "text": "Make sure you have an HPC Account\nIf you want to work from home, you need connect to the RWTH VPN" + "text": "Project profiles allow to branch the content within one document. We will primarily use this to differentiate between student and lectuerer content (e.g. the visibility of solutions).\n\n\nDefault setting can be found in the _quarto.yml under profile > default is equivalent to exporting the environment variable\nexport QUARTO_PROFILE=\"lecturer, shallowflow-reduced\"\nIn order to generate a student version, export the following environment variable and render:\nexport QUARTO_PROFILE=\"student\"\nquarto render\nAll available options are listed in the _quarto.yml, under the profile > group keyword. The group lists indicate that we currenly use two mutually exclusive settings:\nprofile:\n default: lecturer, shallowflow-reduced\n group: \n - [lecturer, student]\n - [shallowflow-reduced, shallowflow-full]\nThe default option os always the first item in the list. However, by specifying the default argument, we make the default setting more verbose.\n\n\n\nIn order to create a Exercise with solution, you can use the following template:\n# Exercise title\nEXERCISE\n::: {.content-visible when-profile=\"lecturer\"}\nSOLUTION\n:::\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPaste your pdf in content/resources/pdfs.\nAdd a filename.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/pdfs/resource.pdf\"\n categories: [demo]\n\nAdd the resource.pdf as well as the filename.yaml to git.\n\n\n\n\nWe use Revealjs resources.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsecase: Content that has its own requirements or projects that should be accessable independently of the general toolchain.\n\n\nA presentation starts as a completely indepentent project that is only merged later. If you want start from a template, you can use the demo in content/resources/content/demo.\n\nPaste your content into as a new folder in content/resources/content (or copy the template folder).\nAdd your content into the index.qmd file.\n\n\n\n\n\nPaste your presentation into as a new folder in content/resources/content (or copy the templte folder).\nCheck that your preamble contains the following (e.g. in the _quarto.yml or in the metadata section of index.qmd):\n\n output-dir: _output\n output-file: index.html\n standalone: true\n embed-resources: true\n\n(optional) use global references: add the following to the preamble:\n\nbibliography: \n - references.bib\n - ./../../../references.bib\n\nAdd a presentationname.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/content/demo/_output/index.html\"\n categories: [demo]\n\n\n\n\n\n\nImportant\n\n\n\nThe path is critical in such that the file can be found. The rest is optional data that is shown in the listing on the webpage.\n\n\n\nCommit content/resources/content/<your new folder>/_output/index.html.\npush" }, { - "objectID": "content/wiki/how_to_homework.html#helpful-pointers", - "href": "content/wiki/how_to_homework.html#helpful-pointers", - "title": "Work you your homework in the RWTH Cluster", + "objectID": "content/wiki/authoring.html#authoring", + "href": "content/wiki/authoring.html#authoring", + "title": "Lecturer FAQ", "section": "", - "text": "Log into the Cluster\nHow to add your SSH keys for a more convenient login\nNote that there are multiple login nodes to the RWTH Cluster." + "text": "Project profiles allow to branch the content within one document. We will primarily use this to differentiate between student and lectuerer content (e.g. the visibility of solutions).\n\n\nDefault setting can be found in the _quarto.yml under profile > default is equivalent to exporting the environment variable\nexport QUARTO_PROFILE=\"lecturer, shallowflow-reduced\"\nIn order to generate a student version, export the following environment variable and render:\nexport QUARTO_PROFILE=\"student\"\nquarto render\nAll available options are listed in the _quarto.yml, under the profile > group keyword. The group lists indicate that we currenly use two mutually exclusive settings:\nprofile:\n default: lecturer, shallowflow-reduced\n group: \n - [lecturer, student]\n - [shallowflow-reduced, shallowflow-full]\nThe default option os always the first item in the list. However, by specifying the default argument, we make the default setting more verbose.\n\n\n\nIn order to create a Exercise with solution, you can use the following template:\n# Exercise title\nEXERCISE\n::: {.content-visible when-profile=\"lecturer\"}\nSOLUTION\n:::" }, { - "objectID": "content/wiki/how_to_homework.html#way-1-using-your-web-browser", - "href": "content/wiki/how_to_homework.html#way-1-using-your-web-browser", - "title": "Work you your homework in the RWTH Cluster", + "objectID": "content/wiki/authoring.html#adding-a-pdf", + "href": "content/wiki/authoring.html#adding-a-pdf", + "title": "Lecturer FAQ", "section": "", - "text": "You need to be in the network of RWTH. Use VPN if necessary.\n\n\nIn your browser, open\nhttps://login23-x-1.hpc.itc.rwth-aachen.de:3300/auth/ssh/\nand log into the cluster.\n\nCreate a session, e.g. MATE (us)\n\n\n\n(optional) You may want to download the Desktop Clients instead of using your browser.\n\n\n\n\n\n\nOpen a terminal\nDownload the Container (Apptainer) of our course, e.g.\n\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nls\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nOpen firefox\nStart a Jupyter server with\n\napptainer run dolfinx_latest.sif notebook\n\nClick the link or copy it to your browser\n\n\n\n\ncrea" + "text": "Paste your pdf in content/resources/pdfs.\nAdd a filename.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/pdfs/resource.pdf\"\n categories: [demo]\n\nAdd the resource.pdf as well as the filename.yaml to git." }, { - "objectID": "content/exercises/homework_template.html#tasks", - "href": "content/exercises/homework_template.html#tasks", - "title": "Homework Template", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" + "objectID": "content/wiki/authoring.html#adding-a-new-presentation", + "href": "content/wiki/authoring.html#adding-a-new-presentation", + "title": "Lecturer FAQ", + "section": "", + "text": "We use Revealjs resources.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsecase: Content that has its own requirements or projects that should be accessable independently of the general toolchain.\n\n\nA presentation starts as a completely indepentent project that is only merged later. If you want start from a template, you can use the demo in content/resources/content/demo.\n\nPaste your content into as a new folder in content/resources/content (or copy the template folder).\nAdd your content into the index.qmd file.\n\n\n\n\n\nPaste your presentation into as a new folder in content/resources/content (or copy the templte folder).\nCheck that your preamble contains the following (e.g. in the _quarto.yml or in the metadata section of index.qmd):\n\n output-dir: _output\n output-file: index.html\n standalone: true\n embed-resources: true\n\n(optional) use global references: add the following to the preamble:\n\nbibliography: \n - references.bib\n - ./../../../references.bib\n\nAdd a presentationname.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/content/demo/_output/index.html\"\n categories: [demo]\n\n\n\n\n\n\nImportant\n\n\n\nThe path is critical in such that the file can be found. The rest is optional data that is shown in the listing on the webpage.\n\n\n\nCommit content/resources/content/<your new folder>/_output/index.html.\npush" }, { - "objectID": "content/exercises/homework05.html#tasks", - "href": "content/exercises/homework05.html#tasks", - "title": "Homework 5", + "objectID": "content/exercises/homework06.html#tasks", + "href": "content/exercises/homework06.html#tasks", + "title": "Homework 6", "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that the SWE with velocity profile correction are not Galilean invariant.\n\n\nTask 2\nIf we assume plug-flow \\((\\alpha=1)\\), show that the SWE are Galilean invariant." + "text": "Tasks\n\nTask 1\nExplain the physical meaning of the terms (I), (II), and (III) of the heat equation.\n\n\nTask 2\nGive the SI base units of \\(t\\), \\(x\\), \\(v\\), and \\(\\lambda\\).\n\n\nTask 3\nWe introduce the dimensionless variables\n\\[\n\\begin{aligned}\n t:=t_0\\tilde{t}, \\, x:=x_0\\tilde{x}, \\, v:=v_0\\tilde{v}, \\text{and } T:=\\underbrace{\\left(T_\\mathrm{wall} - T_\\mathrm{inf}\\right)}_{T_0} \\tilde{T} + T_\\mathrm{inf}.\n\\end{aligned}\n\\]\nWrite both equation Equation 1 and the boundary conditions Equation 2 in dimensionless variables. Identify the Peclet number \\(\\mathrm{Pe}=\\frac{v_0 x_0}{\\lambda}\\).\nNow consider a physical regime characterized by \\(t_0 \\gg \\frac{x_0^2}{\\lambda}\\).\n\n\nTask 4\nHow does the equation read in this physical regime?\n\n\nTask 5\nSolve for the temperature profile and sketch the solution.\n\n\nTask 6\nHow does the profile change as the thermal diffusivity decreases? Indicate it in the sketch!\n\n\nTask 7\nIf \\(\\lambda\\) doubles, how does the velocity need to change to retain the same profile?" }, { - "objectID": "content/exercises/homework05.html#tasks-1", - "href": "content/exercises/homework05.html#tasks-1", - "title": "Homework 5", + "objectID": "content/exercises/homework06.html#tasks-1", + "href": "content/exercises/homework06.html#tasks-1", + "title": "Homework 6", "section": "Tasks", - "text": "Tasks\n\nTask 1\nWhat does \\(\\alpha\\) stand for and how can it be computed? Determine \\(\\alpha\\) for a linear velocity profile with \\(u(y=0) = 0\\) and \\(u(y=h) = u_s\\).\n\n\nTask 2\nAssume a shallow lake, currently at rest. That means \\(h=H\\) and \\(u=0\\). A stone is thrown into the lake and causes a small surface perturbation in height and velocity, denoted by \\(h_1\\) and \\(u_1\\). Derive a of equations for \\(h_1\\) and \\(u_1\\) by means of linearization\n\n\n\n\n\n\nTip\n\n\n\nThe linearization can be performed by looking at small perturbations from a ground state \\((h_0, u_0)\\), e.g. by defining: \\(h(x,t) = h_0(x, t) + \\delta \\, h_1(x,t) + \\mathcal{O}( \\delta^2 )\\) and \\(u(x,t) = u_0(x, t) + \\delta \\, u_1(x,t) + \\mathcal{O}( \\delta^2 )\\), where \\(\\delta\\) denotes the small amplitude of the perturbation.\n\n\n\n\nTask 3\nReduce the system derived in Task 2 to an equation for \\(h_1\\). What type of equation do we find?\n\n\nTask 4\nThe wave ansatz is given by \\(h_1(x,t) = A \\, e^{i (k \\, x - \\omega \\, t)}\\). State what \\(A\\), \\(i\\), \\(k\\) and \\(\\omega\\) stand for? Using the wave ansatz, compute the phase velocity.\n\n\nTask 5\nAssume that we wait \\(10s\\) until a surface perturbation caused by a stone reaches the lake’s shore. How much longer would we have to wait at a similarly sized lake on Saturn’s moon Titan? (Titan has surface lakes of liquid ethane and methane and a gravitational acceleration of \\(g=1.4 \\frac{m}{s^2}\\))" + "text": "Tasks\n\nTask 1\nInterpret the physical meaning of each of these conditions.\n\n\nTask 2\nIntroduce the similarity variable \\(\\eta := \\frac{x}{2\\sqrt{Dt}}\\) and write both temperature and mass diffusion (Equation 3), in terms of the similarity variable.\n\n\nTask 3\nThe resulting ODE system can be solved in terms of the (unknown) interface position \\(X_\\mathrm{m}=X(t)\\) and written in \\(x\\) and \\(t\\) again. Derive the solution (get inspired by the lecture).\n\n\nTask 4\nDiscuss which of the relations/boundary conditions 1. – 8. are fulfilled versus what is still unknown.\n\n\nTask 5\nMake the Ansatz: \\(X_\\mathrm{m}(t) = 2\\lambda\\sqrt{Dt}\\) (similar to lecture, but with \\(D\\) instead of \\(\\alpha\\)). Substitute the derived solutions for \\(T\\) and \\(C\\) into the Stefan condition and salt rejection and derive an algebraic system that allows us to determine \\(C_\\mathrm{i}\\), \\(T_\\mathrm{i}\\) and \\(\\lambda\\).\n\n\nTask 6\nCombine the derived equations into one equation for \\(\\lambda\\). Determine \\(\\lambda\\) for freezing sea water with \\(T_\\mathrm{B} = -10^\\circ C\\), \\(T_\\infty=2^\\circ C\\), \\(T_\\mathrm{m}=0^\\circ C\\), \\(C_\\infty=3.5\\%\\), \\(D=1.33 \\times 10^{-9}m^2s^{-1}\\) (Na-Ions in Water), \\(\\alpha_\\mathrm{ice} = 1.203 \\times 10^{9}m^2s^{-1}\\), \\(\\alpha_\\mathrm{water} = 0.14 \\times 10^{9}m^2s^{-1}\\), \\(L=334 \\times 10^{3} J\\), \\(c_p=2.05 \\times 10^{3} J kg^{-1} K^{-1}\\) and \\(m\\approx 1 K \\%^{-1}\\) (i.e., for each percent of salt the melting temperature is reduced by 1K; valid until about 20 % of salts). Plot the solution and discuss what you see." }, { - "objectID": "content/exercises/homework05.html#tasks-2", - "href": "content/exercises/homework05.html#tasks-2", - "title": "Homework 5", + "objectID": "content/exercises/homework04.html#tasks", + "href": "content/exercises/homework04.html#tasks", + "title": "Homework 4", "section": "Tasks", - "text": "Tasks\n\nTask 1\nDerive the weak formulation of Equation 1 using the following strategy\n\nWe define a indicator function (test function)\n\n\\[\n\\phi(x, t) =\n\\begin{cases}\n 1 & \\text{ for } (x, t) \\in [x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}] \\\\\n 0 & \\text{ else }\n\\end{cases}\n\\]\n\nMultiply Equation 1 by the test function and integrate over the space-time volume \\([x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}]\\).\nWe now want to extend the integration bounds to \\((-\\inf, \\inf) \\times [0, \\inf)\\). Why can we do that?\nWe want to use the fact that we can approximate \\(\\phi\\) with another test function that is continously-differentiable with arbitrary accuracy. Let’s call this new test function \\(\\tilde{\\phi}\\). Use partial integration to derive at the weak formulation of Equation 1. Simplify the expression as much as possible.\n\n\n\nTask 2\nThe statement derived in 4. indicates that the weak-formulation also makes sense in the presence of discontinuities. Why?" + "text": "Tasks\n\nTask 1\nHow is the process model called?\n\n\nTask 2\nFor a constant pressure gradient \\(\\frac{\\partial p}{\\partial z} = -P\\), is the pressure greater at \\(z_0\\) or \\(z_1\\)?\n\n\nTask 3\nHow do mass and momentum balance read in cylindrical coordinates?\n\n\n\n\n\n\nTip\n\n\n\nGradient and divergence in cylindrical coordinates are given by:\n\\[\\begin{align*}\n \\nabla f & = \\frac{\\partial f}{\\partial r } \\vec{e}_r + \\frac{1}{r} \\frac{\\partial f}{\\partial \\theta} \\vec{e}_\\theta+ \\frac{\\partial f}{\\partial z} \\vec{e}_z, \\\\\n \\nabla \\cdot \\vec{A} & = \\frac{1}{r}\\frac{\\partial}{\\partial r }(r A_r) + \\frac{1}{r} \\frac{\\partial A_\\theta}{\\partial \\theta} + \\frac{\\partial A_z}{\\partial z} \\\\\n \\nabla \\times \\vec{A} & = \\left(\\frac{1}{r}\\frac{\\partial A_z}{\\partial \\theta}-\\frac{\\partial A_\\theta}{\\partial z}\\right)\\vec{e}_r+ \\left(\\frac{\\partial A_r}{\\partial z}-\\frac{\\partial A_z}{\\partial r}\\right)\\vec{e}_\\theta+\\frac{1}{r}\\left(\\frac{\\partial}{\\partial r}(r A_\\theta)-\\frac{\\partial A_r}{\\partial \\theta}\\right) \\vec{e}_z \n\\end{align*}\\]\n\n\n\n\nTask 4\nAssuming constant pressure in the cross-sectional area \\(\\frac{\\partial p}{\\partial {\\theta}} = \\frac{\\partial p}{\\partial r } = 0\\), how do mass and momentum balance reduce? What does this imply for the velocity field?\n\n\nTask 5\nFurthermore, there will be no change in the pipe’s flow field in time and no flow in radial direction or rotational direction. Hence \\(u_z = u_z(r, \\theta)\\) and \\(u_r = u_{\\theta} = 0\\). How does the remaining process model look like?\n\n\nTask 6\nDerive an explicit expression for the velocity profile. Also, derive an expression that yields the volume discharge?\n\n\nTask 7\nAssume that the pressure grdient drops by a factor of \\(50\\%\\). How can you change the setting to assure the same volume discharge?" }, { - "objectID": "content/exercises/homework05.html#tasks-3", - "href": "content/exercises/homework05.html#tasks-3", - "title": "Homework 5", + "objectID": "content/exercises/homework04.html#tasks-1", + "href": "content/exercises/homework04.html#tasks-1", + "title": "Homework 4", "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that Equation 2 is equivalent to Equation 3:\n\\[\n\\mathbf{f}_{i+1/2}^{Roe} = \\frac{1}{2} \\left( \\mathbf{f}_l + \\mathbf{f}_r \\right) - \\frac{1}{2} \\Big| \\bar{\\mathbf{A}}(\\tilde{\\mathbf{Q}}) \\Big| \\cdot \\left( \\mathbf{Q}_R - \\mathbf{Q}_L \\right)\n\\tag{3}\\]\nwhere \\(\\big| \\mathbf{A} \\big| = \\mathbf{R} \\Big| \\mathbf{\\Lambda} \\Big| \\mathbf{R}^{-1}\\) for a given eigen-decomposition \\(\\mathbf{A} = \\mathbf{R} \\mathbf{\\Lambda} \\mathbf{R}^{-1}\\)." + "text": "Tasks\n\nTask 1\nDraw a sketch of the situation. Indicate all mentioned variables and the coordinate system. Explain why the velocity in both y- and z-direction vanish.\n\n\nTask 2\nDetermine an equation for the velocity profile in the fluid.\n\n\n\n\n\n\nTip\n\n\n\nThe volume flowing through a specific cross-section per unit time calculates as \\[\\begin{equation*}\n \\dot{V} = \\int_F \\vec{v}\\cdot d\\vec{F}.\n\\end{equation*}\\] Here, with the width \\(L\\), this simplifies to \\[\\begin{equation*}\n \\frac{\\dot{V}}{L} = \\int_0^a v_x dy.\n\\end{equation*}\\]\n\n\n\n\nTask 3\nDerive an equation for the volume flow rate per unit width.\n\n\nTask 4\nCalculate how much oil does the oil skimmer actually remove per unit time?" }, { - "objectID": "content/exercises/homework03.html#tasks", - "href": "content/exercises/homework03.html#tasks", - "title": "Homework 3", + "objectID": "content/exercises/homework04.html#tasks-2", + "href": "content/exercises/homework04.html#tasks-2", + "title": "Homework 4", "section": "Tasks", - "text": "Tasks\n\nTask 1\nUsing Hooke’s law, calculate the stretch in a new 6 m long steel (Young’s Modulus \\(E= 20 \\times 10^{10} \\text{Pa}\\)) pipe that supports a \\(100 \\text{kg}\\) drill bit and a \\(3 \\text{km}\\) long pipe with a linear mass density of \\(20 \\text{kg} \\text{m}^{-1}\\). Treat the pipe as a solid cylinder with a \\(5 \\text{cm}\\) diameter.\n\n\nTask 2\nAssuming a Poisson’s ratio \\(\\nu = \\dfrac{1}{3}\\), what is the corresponding cross-sectional thinning?\n\n\nTask 3\nCalculate the bulk modulus and the Lame constants for the steel pipe.\n\n\nTask 4\nUsing the Voigt notation, calculate the Stiffness Matrix for the case of Linear Elasticity using the Lame’s constants." + "text": "Tasks\n\nTask 1\nCompute the nondimensional version of Equation 2 using the scales\n\\[\n\\tilde{t} = t / t_0 \\quad \\tilde{x_i} = x_i / L_0 \\quad \\tilde{v_i} = v_i / U_{0} \\quad \\tilde{p} = p / p_0 \\quad.\n\\]\nYour expression should contain the following nondimensional numbers:\n\nStrouhal number \\(Str := \\frac{L_0}{t_0 \\, U_0}\\)\nReynold’s number \\(Re := \\frac{L_0 U_0}{\\nu}\\)\nMach number \\(Ma := \\frac{U_0}{a_0}\\)\n\nwhere \\(a_0\\) is the speed of sound in water. \\(a_0\\) is related to the other variables as \\(a_0^2 = \\frac{p_0}{\\rho_0}\\).\n\n\nTask 2\nAssume a steady flow with a small Mach number \\(Ma \\ll 1\\).\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\n\n\n\n\n\nNote\n\n\n\n\\(\\mathcal{o}(Ma^2)\\) indicates that all other terms are arbitrarily small compared to \\(Ma^2\\).\n\n\n\n\nTask 3\nAssume a steady flow with a small velocity \\(U_0 \\ll 1\\). Assume that all other quantities remain constant.\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\n\n\n\n\n\nTip\n\n\n\nIt makes sense to rewrite the Reynold’s number in terms of the Mach number times a constant. How is this constant defined?\n\n\n\n\nTask 4\nDescribe in your own words what the different equations model." }, { - "objectID": "content/exercises/homework03.html#tasks-1", - "href": "content/exercises/homework03.html#tasks-1", - "title": "Homework 3", + "objectID": "content/exercises/homework02.html#tasks", + "href": "content/exercises/homework02.html#tasks", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nDecompose the deformation gradient and identify the dilation, rotation and stretch.\n\n\nTask 2\nDetermine about which co-ordinate axis rotation takes place. By what angle is the sample rotated?" + "text": "Tasks\n\nTask 1\nDecompose the given velocity fields and calculate for each field: \\(\\mathbf{w}\\) and \\(\\mathbf{D}\\)\n\n\nTask 2\nDescribe the motion produced by each velocity field.\n\n\nTask 3\nSketch each flow field within a domain given by \\(x,y \\in [-4, 4]\\times [-4, 4]\\)\n\n\nTask 4\nWithin the flow field, sketch how a volume element having vertices \\((1, 1), (1, 2), (2, 2), (2,1)\\) deforms." }, { - "objectID": "content/exercises/homework03.html#tasks-2", - "href": "content/exercises/homework03.html#tasks-2", - "title": "Homework 3", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDraw a sketch of the experiment. Write down the stress and strain tensor for this experiment. Does shear occur in the experiment?\n\n\nTask 2\nUsing the constitutive relation for Isotropic Linear Elasticity, calculate the elastic constants \\(\\lambda\\) and \\(\\mu\\) for this rock sample.\n\n\nTask 3\nCalculate the Young’s Modulus and Poisson’s ratio for rock material.\n\n\nTask 4\nUsing the Voigt Notation, compute the Compliance Matrix for the rock material." + "objectID": "content/exercises/homework02.html#setup", + "href": "content/exercises/homework02.html#setup", + "title": "Homework 2", + "section": "Setup", + "text": "Setup\nFor the visualization, we shall use the python libraries numpy and matplotlib. Here, we first import the libraries\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\n\nLet us define a grid of points within the domain \\(x, y \\in [-5, 5] \\times [-5, 5]\\)\n\nx, y = np.meshgrid(np.linspace(-5,5,21),np.linspace(-5,5,21))" }, { - "objectID": "content/exercises/homework03.html#tasks-3", - "href": "content/exercises/homework03.html#tasks-3", - "title": "Homework 3", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDecide whether each of the material model is objective, and give reasons for the decision.\n\n\nTask 2\nDecide whether each of the material model is isotropic, and give reasons for the decision." + "objectID": "content/exercises/homework02.html#task1---velocity-field", + "href": "content/exercises/homework02.html#task1---velocity-field", + "title": "Homework 2", + "section": "Task1 - Velocity Field", + "text": "Task1 - Velocity Field\n\nComputation\nImplement the computation for the components of the velocity vector at every point \\((x, y)\\) on the grid using numpy math functions.\n\n#### YOUR SOLUTION HERE\nv_x = np.zeros_like(x)\nv_y = np.zeros_like(y)\n####\n\n\n\nVisualization\nWe can now visualize the velocity field using a quiver plot\n\n\nCode\nplt.quiver(x,y,v_x, v_y)\nplt.gca().set_aspect('equal')\nplt.xlabel(\"x\")\nplt.ylabel(\"y\")\nplt.title(\"Velocity field\");\nplt.xticks([-5, 0, 5]);\nplt.yticks([-5, 0, 5]);" }, { - "objectID": "content/exercises/homework03.html#tasks-4", - "href": "content/exercises/homework03.html#tasks-4", - "title": "Homework 3", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nThe elastic limit is given for \\(\\alpha > 0\\) and \\(\\beta = 0\\). Show that Equation 1 admits solutions of type Equation 2 which are not dampened in time.\n\n\nTask 2\nThe viscous limit is given for \\(\\alpha = 0\\) and \\(\\beta > 0\\). Show that Equation 1 admits stationary solutions of type Equation 2 which are dampened exponentially in time.\n\n\nTask 3\nHow does the solution look like for the case \\(\\alpha > 0\\) and \\(\\beta > 0\\)? Differentiate the cases\n\n\\(4 \\, \\rho \\alpha > \\beta^2\\)\n\\(4 \\, \\rho \\alpha < \\beta^2\\)" + "objectID": "content/exercises/homework02.html#task-2---velocity-gradient", + "href": "content/exercises/homework02.html#task-2---velocity-gradient", + "title": "Homework 2", + "section": "Task 2 - Velocity Gradient", + "text": "Task 2 - Velocity Gradient\nThe velocity gradient \\(\\nabla \\mathbf{v}\\) is a second order tensor, and hence cannot be visualized on a 2D plot. Here, we shall look at the individual components of the velocity gradient tensor.\n\nComputation\nCalculate the components of the velocity gradient tensor and implement the computation in the following\n\n#### YOUR SOLUTION HERE\ndvx_dx = np.zeros_like(x)\ndvx_dy = np.zeros_like(y)\ndvy_dx = np.zeros_like(x)\ndvy_dy = np.zeros_like(y)\n####\n\n\n\nVisualization\nWe can now visualize the components of the velocity gradient individually.\n\n\nCode\nfigure, axs = plt.subplots(nrows=2, ncols=2, figsize=(9, 7))\nmin_val = np.min([np.min(dvx_dx), np.min(dvx_dy), np.min(dvy_dx), np.min(dvy_dy)])\nmax_val = np.max([np.max(dvx_dx), np.max(dvx_dy), np.max(dvy_dx), np.max(dvy_dy)])\naxs[0, 0].imshow(dvx_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 0].quiver(x,y,v_x, v_y)\naxs[0, 0].set_xticks([-5, 0, 5])\naxs[0, 0].set_yticks([-5, 0, 5])\naxs[0, 0].set_xlabel(\"x\")\naxs[0, 0].set_ylabel(\"y\")\naxs[0, 0].set_title(r'$\\partial_x v_x$')\n\naxs[0, 1].imshow(dvx_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 1].quiver(x,y,v_x, v_y)\naxs[0, 1].set_xticks([-5, 0, 5])\naxs[0, 1].set_yticks([-5, 0, 5])\naxs[0, 1].set_xlabel(\"x\")\naxs[0, 1].set_ylabel(\"y\")\naxs[0, 1].set_title(r'$\\partial_y v_x$')\n\naxs[1, 0].imshow(dvy_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 0].quiver(x,y,v_x, v_y)\naxs[1, 0].set_xticks([-5, 0, 5])\naxs[1, 0].set_yticks([-5, 0, 5])\naxs[1, 0].set_xlabel(\"x\")\naxs[1, 0].set_ylabel(\"y\")\naxs[1, 0].set_title(r'$\\partial_x v_y$')\n\nim = axs[1, 1].imshow(dvy_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 1].quiver(x,y,v_x, v_y)\naxs[1, 1].set_xticks([-5, 0, 5])\naxs[1, 1].set_yticks([-5, 0, 5])\naxs[1, 1].set_xlabel(\"x\");\naxs[1, 1].set_ylabel(\"y\");\naxs[1, 1].set_title(r'$\\partial_y v_y$');\n\nfigure.subplots_adjust(right=0.8)\ncax,kw = mpl.colorbar.make_axes([ax for ax in axs.flat])\nplt.colorbar(im, cax=cax, **kw)\nplt.show()" }, { - "objectID": "content/exercises/homework03.html#tasks-5", - "href": "content/exercises/homework03.html#tasks-5", - "title": "Homework 3", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that Equation 3 satisfies Equation 4 if and only the condition\n\\[\nA \\, k^2 \\left( \\mu \\mathbf{n}_d + (\\mu + \\lambda) (\\mathbf{n}_d \\cdot \\mathbf{n}_p)\\mathbf{n}_p \\right) = A\\rho\\omega^2 \\mathbf{n}_d\n\\]\nis met.\n\n\nTask 2\nIn the following, we want to show that for a linear elastic, isotropic solid with \\(\\lambda + \\mu \\neq 0\\), plane waves only admit two types of solutions. The first wave type are longitudinal waves in direction \\(\\mathbf{n}_p\\) where \\(\\mathbf{n}_p \\, \\parallel \\, \\mathbf{n}_d\\). The second wave type are transverse waves where \\(\\mathbf{n}_p \\, \\bot \\, \\mathbf{n}_d\\).\nAssume \\(\\lambda + \\mu \\neq 0\\). For any given \\(\\mathbf{n}_p \\neq \\mathbf{0}\\) and \\(A, k \\neq 0\\) show that the only independent solutions \\((\\mathbf{n}_d, \\omega)\\) are:\n\\[\n\\begin{aligned}\n& \\mathbf{n}_d = \\pm \\mathbf{n}_p, \\quad \\omega^2 = k^2 (\\lambda + 2 \\mu) / \\rho, \\\\\n& \\mathbf{n}_d \\cdot \\mathbf{n}_p = 0, \\quad \\omega^2 = k^2 \\mu / \\rho.\n\\end{aligned}\n\\]\n\n\n\n\n\n\nTip\n\n\n\nYou need to identify and solve an eigenvalue problem.\n\n\n\n\nTask 3\nWhat happens in the case \\(\\lambda + \\mu = 0\\)." + "objectID": "content/exercises/homework02.html#task-3---divergence-of-velocity", + "href": "content/exercises/homework02.html#task-3---divergence-of-velocity", + "title": "Homework 2", + "section": "Task 3 - Divergence of Velocity", + "text": "Task 3 - Divergence of Velocity\n\nComputation\nCalculate the divergence of the velocity field using already computed quatities, and implement it in the following.\n\n#### YOUR SOLUTION HERE\ndiv_v = np.zeros_like(dvx_dx)\n####\n\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result\n\n#### YOUR SOLUTION HERE\n\n####" }, { - "objectID": "content/exercises/homework03.html#tasks-6", - "href": "content/exercises/homework03.html#tasks-6", - "title": "Homework 3", + "objectID": "content/exercises/homework02.html#task-4---vorticity", + "href": "content/exercises/homework02.html#task-4---vorticity", + "title": "Homework 2", + "section": "Task 4 - Vorticity", + "text": "Task 4 - Vorticity\n\nComputation\nCalculate the vorticity (or curl) of the velocity field using previously computed quantities and implement it in the following\n\n#### YOUR SOLUTION HERE\ncurl_v = np.zeros_like(dvx_dx)\n####\n\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result.\n\n#### YOUR SOLUTION HERE\n\n####" + }, + { + "objectID": "content/exercises/homework02.html#tasks-1", + "href": "content/exercises/homework02.html#tasks-1", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nAssume \\(\\mathbf{u}\\) is smooth and solves Equation 5. Show that \\(\\mathbf{D}\\) must satify the following six compatibility equations:\n\\[\nD_{nj, km} + D_{km, jn} - D_{kn, jm} - D_{mj, kn} = 0\n\\]\n\n\n\n\n\n\nNote\n\n\n\nThe subscripts before the comma denote the components. The subscript after the comma denote the derivatives." + "text": "Tasks\n\nTask 1\nState the Bernoulli equation and explain to what fluid flow scenarios can it be applied.\n\n\nTask 2\nCalculate the velocity of the flowing fluid in terms of the difference in height of the fluid \\(\\Delta h\\) in the U-shaped tube and other given quantities given in the figure.\n\n\nTask 3\nIf the velocity of the inflowing fluid is doubled, how would \\(\\Delta h\\) change?" }, { - "objectID": "content/exercises/homework01.html#tasks", - "href": "content/exercises/homework01.html#tasks", - "title": "Homework 1", + "objectID": "content/exercises/homework02.html#tasks-2", + "href": "content/exercises/homework02.html#tasks-2", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that the projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\nTask 2\nCalculate the dot-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\) in index notation\n\n\nTask 3\nUsing index notation, calculate the cross-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\)\n\n\nTask 4\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product \\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\n\n\n\n\n\nTip\n\n\n\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]" + "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" }, { - "objectID": "content/exercises/homework01.html#tasks-1", - "href": "content/exercises/homework01.html#tasks-1", - "title": "Homework 1", + "objectID": "content/exercises/homework02.html#tasks-3", + "href": "content/exercises/homework02.html#tasks-3", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nShow that the components of the tensor in the orthonormal basis {\\(\\mathbf{e}_1\\), \\(\\mathbf{e}_3\\), \\(\\mathbf{e}_2\\)} can be calculated as follows \\[\nA_{ij} = \\mathbf{e}_i \\cdot \\mathbf{A} \\mathbf{e}_j\n\\]\n\n\nTask 2\nUsing index notation, show that \\(\\mathbf{v} \\cdot \\mathbf{A}^{T}\\mathbf{u} = \\mathbf{u} \\cdot \\mathbf{A} \\mathbf{v}\\)." + "text": "Tasks\n\nTask 1\nWe want to derive a non-parametric representation of Mohr’s Circle in 2D.\nThe transformation rule for second order tensors is given as\n\\[\n\\sigma' = \\mathbf{R} \\, \\sigma \\, \\mathbf{R}^T\n\\]\nwhere \\(\\mathbf{R}\\) is the rotation matrix\n\\[\n\\mathbf{R}(\\theta)\n=\n\\begin{pmatrix}\ncos(\\theta) & -sin(\\theta) \\\\\nsin(\\theta) & cos(\\theta) \\\\\n\\end{pmatrix}\n\\].\nProceed as follows:\n\nLet \\(\\sigma_x' = \\sigma_n\\) be the normal stress and \\(\\tau_{xy} = \\tau_{n}\\) be the shear stress. Derive a parametric representation of \\(\\sigma_n\\) and \\(\\tau_n\\) using the transformation rule given above.\nSimplify the expression by using trigonometric rules (Hint: we aim for expressions of \\(2\\theta\\))\nObtain a non-parametric expression of a circle, \\((x-a)^2 + (y-b)^2 = r^2\\).\n\n\n\nTask 2\nCompute for \\(\\mathbf{S}_1\\) using Mohr’s circle:\n\nThe maximum shear stress and the angle \\(\\theta\\)\nThe maximal normal stress and the angle \\(\\theta\\)\nThe minimal normal stress and the angle \\(\\theta\\)\n\n\n\nTask 3\nCompute the principal stresses \\((\\sigma_1, \\sigma_2, \\sigma_3)\\) of \\(\\mathbf{S}_2\\). We can now construct Mohr’s circle in 3d as follows:\n\nDraw a coordinate system \\((\\sigma_n, \\tau_n)\\)\nMark the principal stresses on the abscissa\nDraw three circles, each circle passes through two of the three principal stresses marked on the abscissa.\n\n\n\nTask 4\nCompute for \\(\\mathbf{S}_2\\) using Mohr’s circle:\n\nThe maximum shear stress.\nThe maximal normal stress and the correpsonding directional vector.\nThe minimal normal stress and the corresponding directional vector." }, { - "objectID": "content/exercises/homework01.html#tasks-2", - "href": "content/exercises/homework01.html#tasks-2", - "title": "Homework 1", + "objectID": "content/exercises/homework02.html#tasks-4", + "href": "content/exercises/homework02.html#tasks-4", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nUsing a cartesian co-ordinate system, show that \\[\n\\nabla \\times (\\nabla u) = \\mathbf{0}\n\\]\n\n\nTask 2\nUsing a cylindrical co-ordinate system, show that \\[\n\\nabla \\cdot (\\nabla \\times \\mathbf{v}) = 0\n\\]\n\n\nTask 3\nCalculate in a spherical co-ordinate system the value of \\(\\Delta u\\)\n\n\nTask 4\nGiven another scalar field \\(\\alpha\\), using cartesian co-ordinates, show that\n\\[\n\\nabla \\cdot (\\alpha \\mathbf{v}) = \\alpha \\nabla \\cdot \\mathbf{v} + \\mathbf{v} \\cdot \\nabla \\alpha\n\\]" + "text": "Tasks\n\nTask 1\nDerive the weak formulation of the problem assuming that the displacement \\(\\mathbf{u} \\in H^1(\\Omega)\\) and test function \\(\\phi \\in H^1(\\Omega)\\). Make sure to differentiate between the Dirichlet and Neumann boundary term. Why is the implementation of the Dirichlet term in this weak formulation difficult?\n\n\n\n\n\n\nNote\n\n\n\nRecall the very common notation that a function space with subscript zero, e.g. \\(\\mathbb{V}_0\\) denotes compact support. For our purposes, this means that the function vanishes at the boundary.\n\n\n\n\n\n\n\n\nNote\n\n\n\nRecall from your PDE class that \\(H^1\\) denotes a Hilbert space.\n\n\n\n\n\n\n\n\nTip\n\n\n\nRecall from your PDE-class that a weak formulation is derived by multiplying your problem with a test function (e.g. denoted as \\(\\phi\\)) and integrated over the domain \\(\\Omega\\). Often, integration by parts is employed to reduce the demands on the funtional space of the solution.\nYour weak formulation always needs to be stated in a way similar to the following:\nFind \\(\\mathbf{u} \\in \\mathbb{V}\\) such that \\[\n \\begin{cases}\n & \\text{YOUR } \\\\\n & \\text{PROBLEM} \\\\\n & \\text{STATEMENT} \\\\\n \\end{cases}\n\\] \\(\\forall \\phi \\in \\mathbb{W}\\)\nWhere \\(\\phi \\in \\mathbb{W}\\) denotes the test function we used to derive the weak form.\n\n\n\n\nTask 2\nA typical solution strategy to solve the issue with the Dirichlet boundary condition is to ‘lift’ the problem. We will do this step by step\n\nConstruct a (simple) function \\(\\mathbf b(x, y)\\) that fulfills \\(\\mathbf b(0, y) = \\mathbf g_0(y)\\) and \\(\\mathbf b(1, y) = \\mathbf g_1(y)\\).\nDefine a new function \\(\\mathbf w = \\mathbf u - \\mathbf b\\)\nConsider a suitable function space for \\(w\\). What changed compared to the function space of \\(u\\)?\nSubstituve \\(\\mathbf w\\) into the strong formulation of our problem. Do not forget the boundary conditions.\nWrite down the weak formulation for the problem statement derived in 4. Make sure to choose an approriate (and useful) function space for the test function as well.\nAssume you are given the solution \\(\\mathbf w^*\\) for the weak formulation you posed in 5. Write down the solution for \\(\\mathbf u\\)." }, { - "objectID": "content/exercises/homework01.html#tasks-3", - "href": "content/exercises/homework01.html#tasks-3", - "title": "Homework 1", + "objectID": "content/exercises/homework02.html#tasks-5", + "href": "content/exercises/homework02.html#tasks-5", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nUsing the mass balance law, calculate the value of \\[\n\\dfrac{1}{\\rho} \\dfrac{D(\\rho)}{Dt}\n\\]\n\n\nTask 2\nIn the Eulerian formulation, write down the momentum balance law in component notation.\n\n\n\n\n\n\nTip\n\n\n\nIn the Lagrangian formulation, the component notation of the momentum balance law is given as \\[\nx: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{xx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{xy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{xz}}{\\partial z}\\right) + b_x\n\\] \\[\ny: \\dfrac{Dv_{y}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{yx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{yy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{yz}}{\\partial z}\\right) + b_y\n\\] \\[\nz: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{zx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{zy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{zz}}{\\partial z}\\right) + b_z\n\\]\n\n\n\n\nTask 3\nIn the Eulerian formulation, write down the mass and momentum balance laws in index notation" + "text": "Tasks\n\nTask 1\nCompute the Cauchy stress tensor \\(\\mathbf{\\sigma} \\in \\mathbb{R}^{3x3}\\) by directly solving the linear system associated with \\(\\mathbf{t}^i = \\mathbf{\\sigma} \\mathbf{n}^i\\) for \\(i=\\{1,2,3\\}\\).\n\n\n\n\n\n\nNote\n\n\n\nYou can use your computer to solve the system if you want.\n\n\n\n\nTask 2\nNow we want to solve for the stress tensor without the need to solve a linear system. You can do so by changing the coordinate system such that\n\\[\n \\mathbf{\\tilde{t}} = \\mathbf{\\tilde{\\sigma}} \\mathbf{n} = \\mathbf{\\tilde{\\sigma}} \\mathbf{e}\n\\]\nwhere \\(\\mathbf{n}\\) is an arbitrary vector of unit length and \\(\\mathbf{e}\\) is a cartesian unit vector. Then the rows of \\(\\mathbf{\\tilde{\\sigma}}\\) are given \\(\\mathbf{\\tilde{t}}\\)." }, { - "objectID": "content/exercises/homework01.html#tasks-4", - "href": "content/exercises/homework01.html#tasks-4", - "title": "Homework 1", + "objectID": "content/exercises/homework02.html#tasks-6", + "href": "content/exercises/homework02.html#tasks-6", + "title": "Homework 2", "section": "Tasks", - "text": "Tasks\n\nTask 1\nSketch two trajectories for \\(t \\in (0, 2 \\pi)\\) as well as their respective field values \\(\\phi(\\mathbf X(t), t)\\) over time.\n\n\nTask 2\nDescribe \\(\\phi(\\mathbf X(t), t)\\) in the Eulerian frame.\n\n\nTask 3\nConsider another field given by \\(\\psi(\\mathbf X(t), t) = X^2 + Y^2\\). Rewrite \\(\\psi\\) in the Eulerian frame.\n\n\nTask 4\nCompute \\(\\frac{d\\phi}{dt}\\) and \\(\\frac{D\\phi}{dt}\\) using their definitions." + "text": "Tasks\n\nTask 1\nWe are now interessted in gaining a better understanding of the physical meaning of the theorem.\nFor that matter, proceed as follows:\n\nWrite down the Divergence Threorem while explicitly keeping track of the dependence on the spatial coordinate \\(\\mathbf{x} \\in B\\), where \\(B = (\\mathbf{y}, \\delta)\\) indicates a ball with center point \\(y\\) and radius \\(\\delta\\).\nNow we would like to rewrite the divergence term in an expansion around the center point \\(\\mathbf{y}\\) and higher order terms\nSimplify the integral by introducing \\(vol(B)\\).\nIsolate the divergence term and take the limit for \\(\\delta \\rightarrow 0\\).\nInterpret the final relation in your own words.\n\n\n\nTask 2\nGiven \\(\\Omega\\) and \\(\\partial \\Omega\\) as before, we now consider an arbitrary second-order tensor \\(\\mathbf S \\in \\mathbb{R}^{3\\times3}\\). Prove the Tensor Divergence Theorem\n\\[\n\\int_{\\Omega} \\nabla \\cdot \\mathbf S \\: d \\: \\Omega = \\int_{\\partial \\Omega} \\mathbf S \\cdot \\mathbf n \\: d \\: A\n\\tag{1}\\]\n\n\n\n\n\n\nTip\n\n\n\nMultiply (dot product) Equation 1 with an arbitrary (constant) vector. Make use of the Divergence Theorem to proof the Tensor Divergence Theorem." }, { - "objectID": "content/exercises/homework01.html#tasks-5", - "href": "content/exercises/homework01.html#tasks-5", - "title": "Homework 1", + "objectID": "content/exercises/exercise01.html#tasks", + "href": "content/exercises/exercise01.html#tasks", + "title": "Exercise 1", "section": "Tasks", - "text": "Tasks\n\nTask 1\nCompute the pathlines.\n\n\nTask 2\nCompute the streamlines.\n\n\nTask 3\nCompute the streaklines.\n\n\nTask 4\nSketch the velocity field for\n\n\\(t_0 < \\frac{k x}{\\alpha}\\)\n\\(t_1 = \\frac{k x}{\\alpha}\\)\n\\(t_2 > \\frac{k x}{\\alpha}\\)\n\nand furthermore add\n\nthe pathline for one particular \\(\\mathbf x_0\\)\none particular streamline in each figure\nthe streakline starting at \\(t_0\\) for one particular \\(\\mathbf x_0\\)." + "text": "Tasks\n\nShow that the scalar projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\nWrite out the dot-product of two arbitrary vectors \\(\\mathbf{u} \\cdot \\mathbf{v}\\) in component notation and index notation.\n\n\nWrite the cross-product of two arbitrary vectors \\(\\mathbf{u} \\times \\mathbf{v}\\) in component notation and in index notation.\n\n\nWrite the expression \\(\\left(\\mathbf{u} \\cdot \\nabla \\right) \\mathbf{u}\\) in component notation and in index notation.\n\n\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product\n\n\\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\n\n\n\n\n\nTip\n\n\n\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]", + "crumbs": [ + "Exercises", + "Exercise 1" + ] + }, + { + "objectID": "content/exercises/index.html", + "href": "content/exercises/index.html", + "title": "Exercises", + "section": "", + "text": "The course is complemented by weekly exercises. Please consult the semester schedule for dates, unless otherwise notified through Moodle announcements.\nWe split the 90 minutes exercise into two parts:\n\n45 minutes exercise held by the lecturer. We will typically cover\n\na brief lecture summary\ndiscussion of one old exam problem\n\n45 minutes hands-on tutorial and Q&A session. This is your opportunity to\n\nsolve a selected problem on your own\napproach us regarding the current programming homework assignment\n\nDue to time restrictions, we do not plan to discuss the solution of the tutorial problem. We will publish (partial) solutions for these tutorial problems. Feel free to approach us during the tutorial session if you want to make sure that you got the right result!\n\n\n\n\n\n\n\nExercises problems are typically published a couple of days before the exercise session on this website. We encourage students to have a look at the problems in advance.", + "crumbs": [ + "Exercises", + "Exercises" + ] + }, + { + "objectID": "content/exercises/index.html#weekly-exercises", + "href": "content/exercises/index.html#weekly-exercises", + "title": "Exercises", + "section": "", + "text": "The course is complemented by weekly exercises. Please consult the semester schedule for dates, unless otherwise notified through Moodle announcements.\nWe split the 90 minutes exercise into two parts:\n\n45 minutes exercise held by the lecturer. We will typically cover\n\na brief lecture summary\ndiscussion of one old exam problem\n\n45 minutes hands-on tutorial and Q&A session. This is your opportunity to\n\nsolve a selected problem on your own\napproach us regarding the current programming homework assignment\n\nDue to time restrictions, we do not plan to discuss the solution of the tutorial problem. We will publish (partial) solutions for these tutorial problems. Feel free to approach us during the tutorial session if you want to make sure that you got the right result!\n\n\n\n\n\n\n\nExercises problems are typically published a couple of days before the exercise session on this website. We encourage students to have a look at the problems in advance.", + "crumbs": [ + "Exercises", + "Exercises" + ] + }, + { + "objectID": "content/exercises/index.html#homework-assignments", + "href": "content/exercises/index.html#homework-assignments", + "title": "Exercises", + "section": "Homework Assignments", + "text": "Homework Assignments\nIn addition to the weekly exercises, the course is supplemented with biweekly (programming) homework assignments.\nThe homework sheets will be distributed on this website. The publishing dates for the homework assignments can be found in the semester schedule. The deadline is usually one week after the publishing date. The exact deadline can be found on the individual homework assignments.\n\n\n\n\n\n\nCompletion of the homework assignments will grant you bonus points for the final exam.\n\n\n\nThe assignments can be completed in the groups that you will be assigned to in the Moodle course room of this class. The submission of the assignments will also be handled through the Moodle course room.\nDetails regarding the student groups, grading scheme and bonus point policy will be discussed during the first exercise session.\n\n\n\n\n\n\nWarning\n\n\n\nEach homework assignment has a deadline. Submissions after the deadline are not accepted. The submissions cannot be changed after the deadline is expired.\n\n\n\nStudent Groups\nStudents are required to form groups of three students to submit their homework. Groups with less than three members will automatically be merged after the second week of the semester.\n\n\nGrading Scheme\nFor each homework, you can earn up to two points. The points are earned as follows:\n1 Point - Submission (group point) Your submission fulfills the following:\n\nYour homework as uploaded until the deadline expires\nAll tasks in the homework are answered adequately.\nProgramming assignments need to run without error within our provided container on the RWTH Cluster.\nIf the programming homework includes tests, all tests need to pass.\n\n1 Point - Presentation (individual point) You can schedule a group appointment for a presentation in the week after the homework deadline. During this 5 minutes presentation, each present group member will be asked one question from the homework assignment. Which question you will get will be randomized. If you answer the question properly, you will be granted a point.\n\n\nHow can I use the RWTH Cluster for the homework assignments\nSee your wiki entry on ways to work on the homework assignment. In addition, there is a dedicated video on how to get you started published on Moodle.\n\n\nBonus Points Policy\n10% of the total points of the final exam can be gained as bonus points during the semester. These bonus points will be added to the final score of your exam.\n\nBonus point policy\n\n\nHomework points\nExam bonus points\n\n\n\n\n10, 11, 12\n10%\n\n\n9\n9%\n\n\n8\n8%\n\n\n7\n7%\n\n\n6\n6%\n\n\n5\n5%\n\n\n4\n4%\n\n\n3\n3%\n\n\n2\n2%\n\n\n1\n1%", + "crumbs": [ + "Exercises", + "Exercises" + ] + }, + { + "objectID": "index.html", + "href": "index.html", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "", + "text": "This webpage provides material that complements in-person lectures and literature provided therein.\n\n\nThe course is lectured by Prof. Julia Kowalski, head of the Chair of Methods for Model-based Development in Computational Engineering as part of the Simulation Science study program at RWTH Aachen University. It is designed as a 14 week graduate course with 2 lectures and 1 tutorial each week.\n\n\n\nCalculus, linear algebra and basic knowledge of numerical methods for partial differential equations. Basic knowledge on fluid mechanics and thermodynamics is an advantage, but no must.\n\n\n\nThis website is published under the CC BY-NC-SA 4.0 license (go to license). If you want to refer to the content of this webpage, please cite\n@online{CMM,\n author = {Julia Kowalski, Ingo Steldermann, Alan Correa, Marc S. Boxberg, Benjamin Terschanski},\n title = {Continuum Mechanical Modeling for Simulation Science},\n year = 2025,\n url = {https://mbd.pages.rwth-aachen.de/courses/cmm},\n urldate = {YYYY-MM-DD}\n}\n\n\n\nWe greatly value student feedback in all forms! Whether you have a question about notation, need clarification on a concept, identify typos, or wish to discuss your own doubts about a specific topic—or even point out the absence of a resource addressing a particular issue—we welcome your input. We are grateful if you supported us via creating an issue here.\nMany thanks to everyone who has taken the time to share their concerns to enhance the content on this webpage. We are pleased to acknowledge these helpful contributions below:\n\nSteve Bairos\nSheal Karunaratne\nIjaz Aslamsha\n\n\n\n\nThe RWTH Moodle platform is used in conjunction with this weppage. The RWTH Moodle will be used for:\n\nannouncements (change of dates/rooms, exam related information)\ngroups for homework assignments\nhomework submission\n\nThis webpage will be used for:\n\nsharing lecture notes\nsharing slides\nsharing homework sheets\n\nIf you have trouble accessing the RWTH Moodle or parts of this webpage, do not hesitate to contact:\nsteldermann@mbd.rwth-aachen.de, terschanski@mbd.rwth-aachen.de, correa@mbd.rwth-aachen.de." + }, + { + "objectID": "index.html#about-the-course", + "href": "index.html#about-the-course", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "", + "text": "The course is lectured by Prof. Julia Kowalski, head of the Chair of Methods for Model-based Development in Computational Engineering as part of the Simulation Science study program at RWTH Aachen University. It is designed as a 14 week graduate course with 2 lectures and 1 tutorial each week." + }, + { + "objectID": "index.html#required-preliminary-knowledge", + "href": "index.html#required-preliminary-knowledge", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "", + "text": "Calculus, linear algebra and basic knowledge of numerical methods for partial differential equations. Basic knowledge on fluid mechanics and thermodynamics is an advantage, but no must." + }, + { + "objectID": "index.html#how-to-cite", + "href": "index.html#how-to-cite", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "", + "text": "This website is published under the CC BY-NC-SA 4.0 license (go to license). If you want to refer to the content of this webpage, please cite\n@online{CMM,\n author = {Julia Kowalski, Ingo Steldermann, Alan Correa, Marc S. Boxberg, Benjamin Terschanski},\n title = {Continuum Mechanical Modeling for Simulation Science},\n year = 2025,\n url = {https://mbd.pages.rwth-aachen.de/courses/cmm},\n urldate = {YYYY-MM-DD}\n}" + }, + { + "objectID": "index.html#how-to-contribute", + "href": "index.html#how-to-contribute", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "", + "text": "We greatly value student feedback in all forms! Whether you have a question about notation, need clarification on a concept, identify typos, or wish to discuss your own doubts about a specific topic—or even point out the absence of a resource addressing a particular issue—we welcome your input. We are grateful if you supported us via creating an issue here.\nMany thanks to everyone who has taken the time to share their concerns to enhance the content on this webpage. We are pleased to acknowledge these helpful contributions below:\n\nSteve Bairos\nSheal Karunaratne\nIjaz Aslamsha" + }, + { + "objectID": "index.html#additional-important-information", + "href": "index.html#additional-important-information", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "", + "text": "The RWTH Moodle platform is used in conjunction with this weppage. The RWTH Moodle will be used for:\n\nannouncements (change of dates/rooms, exam related information)\ngroups for homework assignments\nhomework submission\n\nThis webpage will be used for:\n\nsharing lecture notes\nsharing slides\nsharing homework sheets\n\nIf you have trouble accessing the RWTH Moodle or parts of this webpage, do not hesitate to contact:\nsteldermann@mbd.rwth-aachen.de, terschanski@mbd.rwth-aachen.de, correa@mbd.rwth-aachen.de." + }, + { + "objectID": "content/schedule/schedule.html", + "href": "content/schedule/schedule.html", + "title": "Schedule SS25", + "section": "", + "text": "If not announced otherwise on moodle, the lectures/exercises take place as such:\nLectures:\n\nMonday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\nFriday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExercises:\n\nFriday, 14:30 – 16:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExam:\n\nTuesday, 05.08.2025, 09:00 – 11:00, FT (2090|120), Melatener Str. 23-25, 1st floor" + }, + { + "objectID": "content/schedule/schedule.html#time-location", + "href": "content/schedule/schedule.html#time-location", + "title": "Schedule SS25", + "section": "", + "text": "If not announced otherwise on moodle, the lectures/exercises take place as such:\nLectures:\n\nMonday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\nFriday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExercises:\n\nFriday, 14:30 – 16:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExam:\n\nTuesday, 05.08.2025, 09:00 – 11:00, FT (2090|120), Melatener Str. 23-25, 1st floor" + }, + { + "objectID": "content/schedule/schedule.html#course-plan", + "href": "content/schedule/schedule.html#course-plan", + "title": "Schedule SS25", + "section": "Course Plan", + "text": "Course Plan\nThe course plan will be updated as we progress with the term. Changes regarding timing and lecture format will be communicated via moodle.\n\n\n\n\n\n\n\n\n\n\nL\nEx\nDay\nDate\nTopic\n\n\n\n\n1\n\nMo\n07.04.2025\nIntroduction\n\n\n2\n\nFr\n11.04.2025\nFundamentals\n\n\n\n1\nFr\n11.04.2025\nExercise session\n\n\n3\n\nMo\n14.04.2025\nBalance laws\n\n\n–\n–\nFr\n18.04.2025\n–\n\n\n–\n–\nMo\n21.04.2025\n–\n\n\n5\n\nFr\n25.04.2025\nIncompressible Euler\n\n\n\n2\nFr\n25.04.2025\nExercise session / release assignment 1\n\n\n6\n\nMo\n28.04.2025\nIncompressible Euler\n\n\n7\n\nFr\n02.05.2025\nForces and stresses\n\n\n\n3\nFr\n02.05.2025\nExercise session\n\n\n8\n\nMo\n05.05.2025\nForces and stresses\n\n\n9\n\nFr\n09.05.2025\nLinear elasticity\n\n\n\n4\nFr\n09.05.2025\nExercise session / release assignment 2\n\n\n10\n\nMo\n12.05.2025\nLinear elasticity\n\n\n11\n\nFr\n16.05.2025\nLinear elasticity\n\n\n\n5\nFr\n16.05.2025\nExercise session\n\n\n12\n\nMo\n19.05.2025\nIncompressible Navier-Stokes\n\n\n13\n\nFr\n23.05.2025\nIncompressible Navier-Stokes\n\n\n\n6\nFr\n23.05.2025\nExercise session / release assignment 3\n\n\n15\n\nMo\n26.05.2025\nPorous media flow\n\n\n16\n\nFr\n30.05.2025\nPorous media flow\n\n\n\n7\nFr\n30.05.2025\nExercise session\n\n\n17\n\nMo\n02.06.2025\nShallow flow\n\n\n18\n\nFr\n06.06.2025\nShallow flow\n\n\n\n8\nFr\n06.06.2025\nExercise session / release assignment 4\n\n\n–\n\nMo\n09.06.2025\n–\n\n\n–\n\nFr\n13.06.2025\n–\n\n\n\n–\nFr\n13.06.2025\n–\n\n\n19\n\nMo\n16.06.2025\nShallow moment equations\n\n\n20\n\nFr\n20.06.2025\nLubricated flow\n\n\n\n9\nFr\n20.06.2025\nExercise session / release assignment 5\n\n\n21\n\nMo\n23.06.2025\nHeat equation\n\n\n22\n\nFr\n27.06.2025\nSolid-liquid phase change\n\n\n\n10\nFr\n27.06.2025\nExercise session\n\n\n23\n\nMo\n30.06.2025\nSolid-liquid phase change\n\n\n24\n\nFr\n04.07.2025\nContact phase change\n\n\n\n11\nFr\n04.07.2025\nExercise session / release assignment 6\n\n\n25\n\nMo\n07.07.2025\nMaxwell\n\n\n26\n\nFr\n11.07.2025\nBloch equations and MRI\n\n\n\n12\nFr\n11.07.2025\nExercise session\n\n\n27\n\nMo\n14.07.2025\nConvection & thermochemistry coupled PC\n\n\n28\n\nFr\n18.07.2025\nReactive transport in porous media\n\n\n\n13\nFr\n18.07.2025\nQ&A" }, { "objectID": "content/exercises/cheatsheet.html", @@ -732,795 +981,837 @@ ] }, { - "objectID": "content/schedule/schedule.html", - "href": "content/schedule/schedule.html", - "title": "Schedule SS25", - "section": "", - "text": "If not announced otherwise on moodle, the lectures/exercises take place as such:\nLectures:\n\nMonday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\nFriday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExercises:\n\nFriday, 14:30 – 16:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExam:\n\nTuesday, 05.08.2025, 09:00 – 11:00, FT (2090|120), Melatener Str. 23-25, 1st floor" - }, - { - "objectID": "content/schedule/schedule.html#time-location", - "href": "content/schedule/schedule.html#time-location", - "title": "Schedule SS25", - "section": "", - "text": "If not announced otherwise on moodle, the lectures/exercises take place as such:\nLectures:\n\nMonday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\nFriday, 8:30 – 10:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExercises:\n\nFriday, 14:30 – 16:00, Eilfschornsteinstr. 18, Room 009, MS\n\nExam:\n\nTuesday, 05.08.2025, 09:00 – 11:00, FT (2090|120), Melatener Str. 23-25, 1st floor" + "objectID": "content/exercises/homework01.html#tasks", + "href": "content/exercises/homework01.html#tasks", + "title": "Homework 1", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nShow that the projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\nTask 2\nCalculate the dot-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\) in index notation\n\n\nTask 3\nUsing index notation, calculate the cross-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\)\n\n\nTask 4\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product \\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\n\n\n\n\n\nTip\n\n\n\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]" }, { - "objectID": "content/schedule/schedule.html#course-plan", - "href": "content/schedule/schedule.html#course-plan", - "title": "Schedule SS25", - "section": "Course Plan", - "text": "Course Plan\nThe course plan will be updated as we progress with the term. Changes regarding timing and lecture format will be communicated via moodle.\n\n\n\n\n\n\n\n\n\n\nL\nEx\nDay\nDate\nTopic\n\n\n\n\n1\n\nMo\n07.04.2025\nIntroduction\n\n\n2\n\nFr\n11.04.2025\nFundamentals\n\n\n\n1\nFr\n11.04.2025\nExercise session\n\n\n3\n\nMo\n14.04.2025\nBalance laws\n\n\n–\n–\nFr\n18.04.2025\n–\n\n\n–\n–\nMo\n21.04.2025\n–\n\n\n5\n\nFr\n25.04.2025\nIncompressible Euler\n\n\n\n2\nFr\n25.04.2025\nExercise session / release assignment 1\n\n\n6\n\nMo\n28.04.2025\nIncompressible Euler\n\n\n7\n\nFr\n02.05.2025\nForces and stresses\n\n\n\n3\nFr\n02.05.2025\nExercise session\n\n\n8\n\nMo\n05.05.2025\nForces and stresses\n\n\n9\n\nFr\n09.05.2025\nLinear elasticity\n\n\n\n4\nFr\n09.05.2025\nExercise session / release assignment 2\n\n\n10\n\nMo\n12.05.2025\nLinear elasticity\n\n\n11\n\nFr\n16.05.2025\nLinear elasticity\n\n\n\n5\nFr\n16.05.2025\nExercise session\n\n\n12\n\nMo\n19.05.2025\nIncompressible Navier-Stokes\n\n\n13\n\nFr\n23.05.2025\nIncompressible Navier-Stokes\n\n\n\n6\nFr\n23.05.2025\nExercise session / release assignment 3\n\n\n15\n\nMo\n26.05.2025\nPorous media flow\n\n\n16\n\nFr\n30.05.2025\nPorous media flow\n\n\n\n7\nFr\n30.05.2025\nExercise session\n\n\n17\n\nMo\n02.06.2025\nShallow flow\n\n\n18\n\nFr\n06.06.2025\nShallow flow\n\n\n\n8\nFr\n06.06.2025\nExercise session / release assignment 4\n\n\n–\n\nMo\n09.06.2025\n–\n\n\n–\n\nFr\n13.06.2025\n–\n\n\n\n–\nFr\n13.06.2025\n–\n\n\n19\n\nMo\n16.06.2025\nShallow moment equations\n\n\n20\n\nFr\n20.06.2025\nLubricated flow\n\n\n\n9\nFr\n20.06.2025\nExercise session / release assignment 5\n\n\n21\n\nMo\n23.06.2025\nHeat equation\n\n\n22\n\nFr\n27.06.2025\nSolid-liquid phase change\n\n\n\n10\nFr\n27.06.2025\nExercise session\n\n\n23\n\nMo\n30.06.2025\nSolid-liquid phase change\n\n\n24\n\nFr\n04.07.2025\nContact phase change\n\n\n\n11\nFr\n04.07.2025\nExercise session / release assignment 6\n\n\n25\n\nMo\n07.07.2025\nMaxwell\n\n\n26\n\nFr\n11.07.2025\nBloch equations and MRI\n\n\n\n12\nFr\n11.07.2025\nExercise session\n\n\n27\n\nMo\n14.07.2025\nConvection & thermochemistry coupled PC\n\n\n28\n\nFr\n18.07.2025\nReactive transport in porous media\n\n\n\n13\nFr\n18.07.2025\nQ&A" + "objectID": "content/exercises/homework01.html#tasks-1", + "href": "content/exercises/homework01.html#tasks-1", + "title": "Homework 1", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nShow that the components of the tensor in the orthonormal basis {\\(\\mathbf{e}_1\\), \\(\\mathbf{e}_3\\), \\(\\mathbf{e}_2\\)} can be calculated as follows \\[\nA_{ij} = \\mathbf{e}_i \\cdot \\mathbf{A} \\mathbf{e}_j\n\\]\n\n\nTask 2\nUsing index notation, show that \\(\\mathbf{v} \\cdot \\mathbf{A}^{T}\\mathbf{u} = \\mathbf{u} \\cdot \\mathbf{A} \\mathbf{v}\\)." }, { - "objectID": "index.html", - "href": "index.html", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "", - "text": "This webpage provides material that complements in-person lectures and literature provided therein.\n\n\nThe course is lectured by Prof. Julia Kowalski, head of the Chair of Methods for Model-based Development in Computational Engineering as part of the Simulation Science study program at RWTH Aachen University. It is designed as a 14 week graduate course with 2 lectures and 1 tutorial each week.\n\n\n\nCalculus, linear algebra and basic knowledge of numerical methods for partial differential equations. Basic knowledge on fluid mechanics and thermodynamics is an advantage, but no must.\n\n\n\nThis website is published under the CC BY-NC-SA 4.0 license (go to license). If you want to refer to the content of this webpage, please cite\n@online{CMM,\n author = {Julia Kowalski, Ingo Steldermann, Alan Correa, Marc S. Boxberg, Benjamin Terschanski},\n title = {Continuum Mechanical Modeling for Simulation Science},\n year = 2025,\n url = {https://mbd.pages.rwth-aachen.de/courses/cmm},\n urldate = {YYYY-MM-DD}\n}\n\n\n\nWe greatly value student feedback in all forms! Whether you have a question about notation, need clarification on a concept, identify typos, or wish to discuss your own doubts about a specific topic—or even point out the absence of a resource addressing a particular issue—we welcome your input. We are grateful if you supported us via creating an issue here.\nMany thanks to everyone who has taken the time to share their concerns to enhance the content on this webpage. We are pleased to acknowledge these helpful contributions below:\n\nSteve Bairos\nSheal Karunaratne\nIjaz Aslamsha\n\n\n\n\nThe RWTH Moodle platform is used in conjunction with this weppage. The RWTH Moodle will be used for:\n\nannouncements (change of dates/rooms, exam related information)\ngroups for homework assignments\nhomework submission\n\nThis webpage will be used for:\n\nsharing lecture notes\nsharing slides\nsharing homework sheets\n\nIf you have trouble accessing the RWTH Moodle or parts of this webpage, do not hesitate to contact:\nsteldermann@mbd.rwth-aachen.de, terschanski@mbd.rwth-aachen.de, correa@mbd.rwth-aachen.de." + "objectID": "content/exercises/homework01.html#tasks-2", + "href": "content/exercises/homework01.html#tasks-2", + "title": "Homework 1", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nUsing a cartesian co-ordinate system, show that \\[\n\\nabla \\times (\\nabla u) = \\mathbf{0}\n\\]\n\n\nTask 2\nUsing a cylindrical co-ordinate system, show that \\[\n\\nabla \\cdot (\\nabla \\times \\mathbf{v}) = 0\n\\]\n\n\nTask 3\nCalculate in a spherical co-ordinate system the value of \\(\\Delta u\\)\n\n\nTask 4\nGiven another scalar field \\(\\alpha\\), using cartesian co-ordinates, show that\n\\[\n\\nabla \\cdot (\\alpha \\mathbf{v}) = \\alpha \\nabla \\cdot \\mathbf{v} + \\mathbf{v} \\cdot \\nabla \\alpha\n\\]" }, { - "objectID": "index.html#about-the-course", - "href": "index.html#about-the-course", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "", - "text": "The course is lectured by Prof. Julia Kowalski, head of the Chair of Methods for Model-based Development in Computational Engineering as part of the Simulation Science study program at RWTH Aachen University. It is designed as a 14 week graduate course with 2 lectures and 1 tutorial each week." + "objectID": "content/exercises/homework01.html#tasks-3", + "href": "content/exercises/homework01.html#tasks-3", + "title": "Homework 1", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nUsing the mass balance law, calculate the value of \\[\n\\dfrac{1}{\\rho} \\dfrac{D(\\rho)}{Dt}\n\\]\n\n\nTask 2\nIn the Eulerian formulation, write down the momentum balance law in component notation.\n\n\n\n\n\n\nTip\n\n\n\nIn the Lagrangian formulation, the component notation of the momentum balance law is given as \\[\nx: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{xx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{xy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{xz}}{\\partial z}\\right) + b_x\n\\] \\[\ny: \\dfrac{Dv_{y}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{yx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{yy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{yz}}{\\partial z}\\right) + b_y\n\\] \\[\nz: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{zx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{zy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{zz}}{\\partial z}\\right) + b_z\n\\]\n\n\n\n\nTask 3\nIn the Eulerian formulation, write down the mass and momentum balance laws in index notation" }, { - "objectID": "index.html#required-preliminary-knowledge", - "href": "index.html#required-preliminary-knowledge", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "", - "text": "Calculus, linear algebra and basic knowledge of numerical methods for partial differential equations. Basic knowledge on fluid mechanics and thermodynamics is an advantage, but no must." + "objectID": "content/exercises/homework01.html#tasks-4", + "href": "content/exercises/homework01.html#tasks-4", + "title": "Homework 1", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nSketch two trajectories for \\(t \\in (0, 2 \\pi)\\) as well as their respective field values \\(\\phi(\\mathbf X(t), t)\\) over time.\n\n\nTask 2\nDescribe \\(\\phi(\\mathbf X(t), t)\\) in the Eulerian frame.\n\n\nTask 3\nConsider another field given by \\(\\psi(\\mathbf X(t), t) = X^2 + Y^2\\). Rewrite \\(\\psi\\) in the Eulerian frame.\n\n\nTask 4\nCompute \\(\\frac{d\\phi}{dt}\\) and \\(\\frac{D\\phi}{dt}\\) using their definitions." }, { - "objectID": "index.html#how-to-cite", - "href": "index.html#how-to-cite", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "", - "text": "This website is published under the CC BY-NC-SA 4.0 license (go to license). If you want to refer to the content of this webpage, please cite\n@online{CMM,\n author = {Julia Kowalski, Ingo Steldermann, Alan Correa, Marc S. Boxberg, Benjamin Terschanski},\n title = {Continuum Mechanical Modeling for Simulation Science},\n year = 2025,\n url = {https://mbd.pages.rwth-aachen.de/courses/cmm},\n urldate = {YYYY-MM-DD}\n}" + "objectID": "content/exercises/homework01.html#tasks-5", + "href": "content/exercises/homework01.html#tasks-5", + "title": "Homework 1", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nCompute the pathlines.\n\n\nTask 2\nCompute the streamlines.\n\n\nTask 3\nCompute the streaklines.\n\n\nTask 4\nSketch the velocity field for\n\n\\(t_0 < \\frac{k x}{\\alpha}\\)\n\\(t_1 = \\frac{k x}{\\alpha}\\)\n\\(t_2 > \\frac{k x}{\\alpha}\\)\n\nand furthermore add\n\nthe pathline for one particular \\(\\mathbf x_0\\)\none particular streamline in each figure\nthe streakline starting at \\(t_0\\) for one particular \\(\\mathbf x_0\\)." }, { - "objectID": "index.html#how-to-contribute", - "href": "index.html#how-to-contribute", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "", - "text": "We greatly value student feedback in all forms! Whether you have a question about notation, need clarification on a concept, identify typos, or wish to discuss your own doubts about a specific topic—or even point out the absence of a resource addressing a particular issue—we welcome your input. We are grateful if you supported us via creating an issue here.\nMany thanks to everyone who has taken the time to share their concerns to enhance the content on this webpage. We are pleased to acknowledge these helpful contributions below:\n\nSteve Bairos\nSheal Karunaratne\nIjaz Aslamsha" + "objectID": "content/exercises/homework03.html#tasks", + "href": "content/exercises/homework03.html#tasks", + "title": "Homework 3", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nUsing Hooke’s law, calculate the stretch in a new 6 m long steel (Young’s Modulus \\(E= 20 \\times 10^{10} \\text{Pa}\\)) pipe that supports a \\(100 \\text{kg}\\) drill bit and a \\(3 \\text{km}\\) long pipe with a linear mass density of \\(20 \\text{kg} \\text{m}^{-1}\\). Treat the pipe as a solid cylinder with a \\(5 \\text{cm}\\) diameter.\n\n\nTask 2\nAssuming a Poisson’s ratio \\(\\nu = \\dfrac{1}{3}\\), what is the corresponding cross-sectional thinning?\n\n\nTask 3\nCalculate the bulk modulus and the Lame constants for the steel pipe.\n\n\nTask 4\nUsing the Voigt notation, calculate the Stiffness Matrix for the case of Linear Elasticity using the Lame’s constants." }, { - "objectID": "index.html#additional-important-information", - "href": "index.html#additional-important-information", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "", - "text": "The RWTH Moodle platform is used in conjunction with this weppage. The RWTH Moodle will be used for:\n\nannouncements (change of dates/rooms, exam related information)\ngroups for homework assignments\nhomework submission\n\nThis webpage will be used for:\n\nsharing lecture notes\nsharing slides\nsharing homework sheets\n\nIf you have trouble accessing the RWTH Moodle or parts of this webpage, do not hesitate to contact:\nsteldermann@mbd.rwth-aachen.de, terschanski@mbd.rwth-aachen.de, correa@mbd.rwth-aachen.de." + "objectID": "content/exercises/homework03.html#tasks-1", + "href": "content/exercises/homework03.html#tasks-1", + "title": "Homework 3", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nDecompose the deformation gradient and identify the dilation, rotation and stretch.\n\n\nTask 2\nDetermine about which co-ordinate axis rotation takes place. By what angle is the sample rotated?" }, { - "objectID": "content/exercises/index.html", - "href": "content/exercises/index.html", - "title": "Exercises", - "section": "", - "text": "The course is complemented by weekly exercises. Please consult the semester schedule for dates, unless otherwise notified through Moodle announcements.\nWe split the 90 minutes exercise into two parts:\n\n45 minutes exercise held by the lecturer. We will typically cover\n\na brief lecture summary\ndiscussion of one old exam problem\n\n45 minutes hands-on tutorial and Q&A session. This is your opportunity to\n\nsolve a selected problem on your own\napproach us regarding the current programming homework assignment\n\nDue to time restrictions, we do not plan to discuss the solution of the tutorial problem. We will publish (partial) solutions for these tutorial problems. Feel free to approach us during the tutorial session if you want to make sure that you got the right result!\n\n\n\n\n\n\n\nExercises problems are typically published a couple of days before the exercise session on this website. We encourage students to have a look at the problems in advance.", - "crumbs": [ - "Exercises", - "Exercises" - ] + "objectID": "content/exercises/homework03.html#tasks-2", + "href": "content/exercises/homework03.html#tasks-2", + "title": "Homework 3", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nDraw a sketch of the experiment. Write down the stress and strain tensor for this experiment. Does shear occur in the experiment?\n\n\nTask 2\nUsing the constitutive relation for Isotropic Linear Elasticity, calculate the elastic constants \\(\\lambda\\) and \\(\\mu\\) for this rock sample.\n\n\nTask 3\nCalculate the Young’s Modulus and Poisson’s ratio for rock material.\n\n\nTask 4\nUsing the Voigt Notation, compute the Compliance Matrix for the rock material." }, { - "objectID": "content/exercises/index.html#weekly-exercises", - "href": "content/exercises/index.html#weekly-exercises", - "title": "Exercises", - "section": "", - "text": "The course is complemented by weekly exercises. Please consult the semester schedule for dates, unless otherwise notified through Moodle announcements.\nWe split the 90 minutes exercise into two parts:\n\n45 minutes exercise held by the lecturer. We will typically cover\n\na brief lecture summary\ndiscussion of one old exam problem\n\n45 minutes hands-on tutorial and Q&A session. This is your opportunity to\n\nsolve a selected problem on your own\napproach us regarding the current programming homework assignment\n\nDue to time restrictions, we do not plan to discuss the solution of the tutorial problem. We will publish (partial) solutions for these tutorial problems. Feel free to approach us during the tutorial session if you want to make sure that you got the right result!\n\n\n\n\n\n\n\nExercises problems are typically published a couple of days before the exercise session on this website. We encourage students to have a look at the problems in advance.", - "crumbs": [ - "Exercises", - "Exercises" - ] + "objectID": "content/exercises/homework03.html#tasks-3", + "href": "content/exercises/homework03.html#tasks-3", + "title": "Homework 3", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nDecide whether each of the material model is objective, and give reasons for the decision.\n\n\nTask 2\nDecide whether each of the material model is isotropic, and give reasons for the decision." }, { - "objectID": "content/exercises/index.html#homework-assignments", - "href": "content/exercises/index.html#homework-assignments", - "title": "Exercises", - "section": "Homework Assignments", - "text": "Homework Assignments\nIn addition to the weekly exercises, the course is supplemented with biweekly (programming) homework assignments.\nThe homework sheets will be distributed on this website. The publishing dates for the homework assignments can be found in the semester schedule. The deadline is usually one week after the publishing date. The exact deadline can be found on the individual homework assignments.\n\n\n\n\n\n\nCompletion of the homework assignments will grant you bonus points for the final exam.\n\n\n\nThe assignments can be completed in the groups that you will be assigned to in the Moodle course room of this class. The submission of the assignments will also be handled through the Moodle course room.\nDetails regarding the student groups, grading scheme and bonus point policy will be discussed during the first exercise session.\n\n\n\n\n\n\nWarning\n\n\n\nEach homework assignment has a deadline. Submissions after the deadline are not accepted. The submissions cannot be changed after the deadline is expired.\n\n\n\nStudent Groups\nStudents are required to form groups of three students to submit their homework. Groups with less than three members will automatically be merged after the second week of the semester.\n\n\nGrading Scheme\nFor each homework, you can earn up to two points. The points are earned as follows:\n1 Point - Submission (group point) Your submission fulfills the following:\n\nYour homework as uploaded until the deadline expires\nAll tasks in the homework are answered adequately.\nProgramming assignments need to run without error within our provided container on the RWTH Cluster.\nIf the programming homework includes tests, all tests need to pass.\n\n1 Point - Presentation (individual point) You can schedule a group appointment for a presentation in the week after the homework deadline. During this 5 minutes presentation, each present group member will be asked one question from the homework assignment. Which question you will get will be randomized. If you answer the question properly, you will be granted a point.\n\n\nHow can I use the RWTH Cluster for the homework assignments\nSee your wiki entry on ways to work on the homework assignment. In addition, there is a dedicated video on how to get you started published on Moodle.\n\n\nBonus Points Policy\n10% of the total points of the final exam can be gained as bonus points during the semester. These bonus points will be added to the final score of your exam.\n\nBonus point policy\n\n\nHomework points\nExam bonus points\n\n\n\n\n10, 11, 12\n10%\n\n\n9\n9%\n\n\n8\n8%\n\n\n7\n7%\n\n\n6\n6%\n\n\n5\n5%\n\n\n4\n4%\n\n\n3\n3%\n\n\n2\n2%\n\n\n1\n1%", - "crumbs": [ - "Exercises", - "Exercises" - ] + "objectID": "content/exercises/homework03.html#tasks-4", + "href": "content/exercises/homework03.html#tasks-4", + "title": "Homework 3", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nThe elastic limit is given for \\(\\alpha > 0\\) and \\(\\beta = 0\\). Show that Equation 1 admits solutions of type Equation 2 which are not dampened in time.\n\n\nTask 2\nThe viscous limit is given for \\(\\alpha = 0\\) and \\(\\beta > 0\\). Show that Equation 1 admits stationary solutions of type Equation 2 which are dampened exponentially in time.\n\n\nTask 3\nHow does the solution look like for the case \\(\\alpha > 0\\) and \\(\\beta > 0\\)? Differentiate the cases\n\n\\(4 \\, \\rho \\alpha > \\beta^2\\)\n\\(4 \\, \\rho \\alpha < \\beta^2\\)" }, { - "objectID": "content/exercises/exercise01.html#tasks", - "href": "content/exercises/exercise01.html#tasks", - "title": "Exercise 1", + "objectID": "content/exercises/homework03.html#tasks-5", + "href": "content/exercises/homework03.html#tasks-5", + "title": "Homework 3", "section": "Tasks", - "text": "Tasks\n\nShow that the scalar projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\nWrite out the dot-product of two arbitrary vectors \\(\\mathbf{u} \\cdot \\mathbf{v}\\) in component notation and index notation.\n\n\nWrite the cross-product of two arbitrary vectors \\(\\mathbf{u} \\times \\mathbf{v}\\) in component notation and in index notation.\n\n\nWrite the expression \\(\\left(\\mathbf{u} \\cdot \\nabla \\right) \\mathbf{u}\\) in component notation and in index notation.\n\n\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product\n\n\\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\n\n\n\n\n\nTip\n\n\n\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]", - "crumbs": [ - "Exercises", - "Exercise 1" - ] + "text": "Tasks\n\nTask 1\nShow that Equation 3 satisfies Equation 4 if and only the condition\n\\[\nA \\, k^2 \\left( \\mu \\mathbf{n}_d + (\\mu + \\lambda) (\\mathbf{n}_d \\cdot \\mathbf{n}_p)\\mathbf{n}_p \\right) = A\\rho\\omega^2 \\mathbf{n}_d\n\\]\nis met.\n\n\nTask 2\nIn the following, we want to show that for a linear elastic, isotropic solid with \\(\\lambda + \\mu \\neq 0\\), plane waves only admit two types of solutions. The first wave type are longitudinal waves in direction \\(\\mathbf{n}_p\\) where \\(\\mathbf{n}_p \\, \\parallel \\, \\mathbf{n}_d\\). The second wave type are transverse waves where \\(\\mathbf{n}_p \\, \\bot \\, \\mathbf{n}_d\\).\nAssume \\(\\lambda + \\mu \\neq 0\\). For any given \\(\\mathbf{n}_p \\neq \\mathbf{0}\\) and \\(A, k \\neq 0\\) show that the only independent solutions \\((\\mathbf{n}_d, \\omega)\\) are:\n\\[\n\\begin{aligned}\n& \\mathbf{n}_d = \\pm \\mathbf{n}_p, \\quad \\omega^2 = k^2 (\\lambda + 2 \\mu) / \\rho, \\\\\n& \\mathbf{n}_d \\cdot \\mathbf{n}_p = 0, \\quad \\omega^2 = k^2 \\mu / \\rho.\n\\end{aligned}\n\\]\n\n\n\n\n\n\nTip\n\n\n\nYou need to identify and solve an eigenvalue problem.\n\n\n\n\nTask 3\nWhat happens in the case \\(\\lambda + \\mu = 0\\)." }, { - "objectID": "content/exercises/homework02.html#tasks", - "href": "content/exercises/homework02.html#tasks", - "title": "Homework 2", + "objectID": "content/exercises/homework03.html#tasks-6", + "href": "content/exercises/homework03.html#tasks-6", + "title": "Homework 3", "section": "Tasks", - "text": "Tasks\n\nTask 1\nDecompose the given velocity fields and calculate for each field: \\(\\mathbf{w}\\) and \\(\\mathbf{D}\\)\n\n\nTask 2\nDescribe the motion produced by each velocity field.\n\n\nTask 3\nSketch each flow field within a domain given by \\(x,y \\in [-4, 4]\\times [-4, 4]\\)\n\n\nTask 4\nWithin the flow field, sketch how a volume element having vertices \\((1, 1), (1, 2), (2, 2), (2,1)\\) deforms." + "text": "Tasks\n\nTask 1\nAssume \\(\\mathbf{u}\\) is smooth and solves Equation 5. Show that \\(\\mathbf{D}\\) must satify the following six compatibility equations:\n\\[\nD_{nj, km} + D_{km, jn} - D_{kn, jm} - D_{mj, kn} = 0\n\\]\n\n\n\n\n\n\nNote\n\n\n\nThe subscripts before the comma denote the components. The subscript after the comma denote the derivatives." }, { - "objectID": "content/exercises/homework02.html#setup", - "href": "content/exercises/homework02.html#setup", - "title": "Homework 2", - "section": "Setup", - "text": "Setup\nFor the visualization, we shall use the python libraries numpy and matplotlib. Here, we first import the libraries\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\n\nLet us define a grid of points within the domain \\(x, y \\in [-5, 5] \\times [-5, 5]\\)\n\nx, y = np.meshgrid(np.linspace(-5,5,21),np.linspace(-5,5,21))" + "objectID": "content/exercises/homework05.html#tasks", + "href": "content/exercises/homework05.html#tasks", + "title": "Homework 5", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nShow that the SWE with velocity profile correction are not Galilean invariant.\n\n\nTask 2\nIf we assume plug-flow \\((\\alpha=1)\\), show that the SWE are Galilean invariant." }, { - "objectID": "content/exercises/homework02.html#task1---velocity-field", - "href": "content/exercises/homework02.html#task1---velocity-field", - "title": "Homework 2", - "section": "Task1 - Velocity Field", - "text": "Task1 - Velocity Field\n\nComputation\nImplement the computation for the components of the velocity vector at every point \\((x, y)\\) on the grid using numpy math functions.\n\n#### YOUR SOLUTION HERE\nv_x = np.zeros_like(x)\nv_y = np.zeros_like(y)\n####\n\n\n\nVisualization\nWe can now visualize the velocity field using a quiver plot\n\n\nCode\nplt.quiver(x,y,v_x, v_y)\nplt.gca().set_aspect('equal')\nplt.xlabel(\"x\")\nplt.ylabel(\"y\")\nplt.title(\"Velocity field\");\nplt.xticks([-5, 0, 5]);\nplt.yticks([-5, 0, 5]);" + "objectID": "content/exercises/homework05.html#tasks-1", + "href": "content/exercises/homework05.html#tasks-1", + "title": "Homework 5", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nWhat does \\(\\alpha\\) stand for and how can it be computed? Determine \\(\\alpha\\) for a linear velocity profile with \\(u(y=0) = 0\\) and \\(u(y=h) = u_s\\).\n\n\nTask 2\nAssume a shallow lake, currently at rest. That means \\(h=H\\) and \\(u=0\\). A stone is thrown into the lake and causes a small surface perturbation in height and velocity, denoted by \\(h_1\\) and \\(u_1\\). Derive a of equations for \\(h_1\\) and \\(u_1\\) by means of linearization\n\n\n\n\n\n\nTip\n\n\n\nThe linearization can be performed by looking at small perturbations from a ground state \\((h_0, u_0)\\), e.g. by defining: \\(h(x,t) = h_0(x, t) + \\delta \\, h_1(x,t) + \\mathcal{O}( \\delta^2 )\\) and \\(u(x,t) = u_0(x, t) + \\delta \\, u_1(x,t) + \\mathcal{O}( \\delta^2 )\\), where \\(\\delta\\) denotes the small amplitude of the perturbation.\n\n\n\n\nTask 3\nReduce the system derived in Task 2 to an equation for \\(h_1\\). What type of equation do we find?\n\n\nTask 4\nThe wave ansatz is given by \\(h_1(x,t) = A \\, e^{i (k \\, x - \\omega \\, t)}\\). State what \\(A\\), \\(i\\), \\(k\\) and \\(\\omega\\) stand for? Using the wave ansatz, compute the phase velocity.\n\n\nTask 5\nAssume that we wait \\(10s\\) until a surface perturbation caused by a stone reaches the lake’s shore. How much longer would we have to wait at a similarly sized lake on Saturn’s moon Titan? (Titan has surface lakes of liquid ethane and methane and a gravitational acceleration of \\(g=1.4 \\frac{m}{s^2}\\))" }, { - "objectID": "content/exercises/homework02.html#task-2---velocity-gradient", - "href": "content/exercises/homework02.html#task-2---velocity-gradient", - "title": "Homework 2", - "section": "Task 2 - Velocity Gradient", - "text": "Task 2 - Velocity Gradient\nThe velocity gradient \\(\\nabla \\mathbf{v}\\) is a second order tensor, and hence cannot be visualized on a 2D plot. Here, we shall look at the individual components of the velocity gradient tensor.\n\nComputation\nCalculate the components of the velocity gradient tensor and implement the computation in the following\n\n#### YOUR SOLUTION HERE\ndvx_dx = np.zeros_like(x)\ndvx_dy = np.zeros_like(y)\ndvy_dx = np.zeros_like(x)\ndvy_dy = np.zeros_like(y)\n####\n\n\n\nVisualization\nWe can now visualize the components of the velocity gradient individually.\n\n\nCode\nfigure, axs = plt.subplots(nrows=2, ncols=2, figsize=(9, 7))\nmin_val = np.min([np.min(dvx_dx), np.min(dvx_dy), np.min(dvy_dx), np.min(dvy_dy)])\nmax_val = np.max([np.max(dvx_dx), np.max(dvx_dy), np.max(dvy_dx), np.max(dvy_dy)])\naxs[0, 0].imshow(dvx_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 0].quiver(x,y,v_x, v_y)\naxs[0, 0].set_xticks([-5, 0, 5])\naxs[0, 0].set_yticks([-5, 0, 5])\naxs[0, 0].set_xlabel(\"x\")\naxs[0, 0].set_ylabel(\"y\")\naxs[0, 0].set_title(r'$\\partial_x v_x$')\n\naxs[0, 1].imshow(dvx_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 1].quiver(x,y,v_x, v_y)\naxs[0, 1].set_xticks([-5, 0, 5])\naxs[0, 1].set_yticks([-5, 0, 5])\naxs[0, 1].set_xlabel(\"x\")\naxs[0, 1].set_ylabel(\"y\")\naxs[0, 1].set_title(r'$\\partial_y v_x$')\n\naxs[1, 0].imshow(dvy_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 0].quiver(x,y,v_x, v_y)\naxs[1, 0].set_xticks([-5, 0, 5])\naxs[1, 0].set_yticks([-5, 0, 5])\naxs[1, 0].set_xlabel(\"x\")\naxs[1, 0].set_ylabel(\"y\")\naxs[1, 0].set_title(r'$\\partial_x v_y$')\n\nim = axs[1, 1].imshow(dvy_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 1].quiver(x,y,v_x, v_y)\naxs[1, 1].set_xticks([-5, 0, 5])\naxs[1, 1].set_yticks([-5, 0, 5])\naxs[1, 1].set_xlabel(\"x\");\naxs[1, 1].set_ylabel(\"y\");\naxs[1, 1].set_title(r'$\\partial_y v_y$');\n\nfigure.subplots_adjust(right=0.8)\ncax,kw = mpl.colorbar.make_axes([ax for ax in axs.flat])\nplt.colorbar(im, cax=cax, **kw)\nplt.show()" + "objectID": "content/exercises/homework05.html#tasks-2", + "href": "content/exercises/homework05.html#tasks-2", + "title": "Homework 5", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nDerive the weak formulation of Equation 1 using the following strategy\n\nWe define a indicator function (test function)\n\n\\[\n\\phi(x, t) =\n\\begin{cases}\n 1 & \\text{ for } (x, t) \\in [x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}] \\\\\n 0 & \\text{ else }\n\\end{cases}\n\\]\n\nMultiply Equation 1 by the test function and integrate over the space-time volume \\([x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}]\\).\nWe now want to extend the integration bounds to \\((-\\inf, \\inf) \\times [0, \\inf)\\). Why can we do that?\nWe want to use the fact that we can approximate \\(\\phi\\) with another test function that is continously-differentiable with arbitrary accuracy. Let’s call this new test function \\(\\tilde{\\phi}\\). Use partial integration to derive at the weak formulation of Equation 1. Simplify the expression as much as possible.\n\n\n\nTask 2\nThe statement derived in 4. indicates that the weak-formulation also makes sense in the presence of discontinuities. Why?" }, { - "objectID": "content/exercises/homework02.html#task-3---divergence-of-velocity", - "href": "content/exercises/homework02.html#task-3---divergence-of-velocity", - "title": "Homework 2", - "section": "Task 3 - Divergence of Velocity", - "text": "Task 3 - Divergence of Velocity\n\nComputation\nCalculate the divergence of the velocity field using already computed quatities, and implement it in the following.\n\n#### YOUR SOLUTION HERE\ndiv_v = np.zeros_like(dvx_dx)\n####\n\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result\n\n#### YOUR SOLUTION HERE\n\n####" + "objectID": "content/exercises/homework05.html#tasks-3", + "href": "content/exercises/homework05.html#tasks-3", + "title": "Homework 5", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nShow that Equation 2 is equivalent to Equation 3:\n\\[\n\\mathbf{f}_{i+1/2}^{Roe} = \\frac{1}{2} \\left( \\mathbf{f}_l + \\mathbf{f}_r \\right) - \\frac{1}{2} \\Big| \\bar{\\mathbf{A}}(\\tilde{\\mathbf{Q}}) \\Big| \\cdot \\left( \\mathbf{Q}_R - \\mathbf{Q}_L \\right)\n\\tag{3}\\]\nwhere \\(\\big| \\mathbf{A} \\big| = \\mathbf{R} \\Big| \\mathbf{\\Lambda} \\Big| \\mathbf{R}^{-1}\\) for a given eigen-decomposition \\(\\mathbf{A} = \\mathbf{R} \\mathbf{\\Lambda} \\mathbf{R}^{-1}\\)." }, { - "objectID": "content/exercises/homework02.html#task-4---vorticity", - "href": "content/exercises/homework02.html#task-4---vorticity", - "title": "Homework 2", - "section": "Task 4 - Vorticity", - "text": "Task 4 - Vorticity\n\nComputation\nCalculate the vorticity (or curl) of the velocity field using previously computed quantities and implement it in the following\n\n#### YOUR SOLUTION HERE\ncurl_v = np.zeros_like(dvx_dx)\n####\n\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result.\n\n#### YOUR SOLUTION HERE\n\n####" + "objectID": "content/exercises/homework_template.html#tasks", + "href": "content/exercises/homework_template.html#tasks", + "title": "Homework Template", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" }, { - "objectID": "content/exercises/homework02.html#tasks-1", - "href": "content/exercises/homework02.html#tasks-1", - "title": "Homework 2", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nState the Bernoulli equation and explain to what fluid flow scenarios can it be applied.\n\n\nTask 2\nCalculate the velocity of the flowing fluid in terms of the difference in height of the fluid \\(\\Delta h\\) in the U-shaped tube and other given quantities given in the figure.\n\n\nTask 3\nIf the velocity of the inflowing fluid is doubled, how would \\(\\Delta h\\) change?" + "objectID": "content/wiki/how_to_homework.html", + "href": "content/wiki/how_to_homework.html", + "title": "Work you your homework in the RWTH Cluster", + "section": "", + "text": "Make sure you have an HPC Account\nIf you want to work from home, you need connect to the RWTH VPN\n\n\n\n\n\nLog into the Cluster\nHow to add your SSH keys for a more convenient login\nNote that there are multiple login nodes to the RWTH Cluster.\n\n\n\n\nYou need to be in the network of RWTH. Use VPN if necessary.\n\n\nIn your browser, open\nhttps://login23-x-1.hpc.itc.rwth-aachen.de:3300/auth/ssh/\nand log into the cluster.\n\nCreate a session, e.g. MATE (us)\n\n\n\n(optional) You may want to download the Desktop Clients instead of using your browser.\n\n\n\n\n\n\nOpen a terminal\nDownload the Container (Apptainer) of our course, e.g.\n\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nls\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nOpen firefox\nStart a Jupyter server with\n\napptainer run dolfinx_latest.sif notebook\n\nClick the link or copy it to your browser\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nRun your python script\napptainer run dolfinx_latest.sif test.py\n\n\n\n\nT.b.d. (Currently not supported)\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nLoad the required module to start Paraview …\nmodule purge; \nmodule load GCC/12.3.0; \nmodule load OpenMPI/4.1.5; \nmodule load ParaView/5.11.2\n… and open Paraview\nparaview\nOpen output files that you created with FenicsX\n\n\n\n\n\n\n\nInstall the ‘Remote - SSH’ Extension\n\n\n\nOpen a remove window (bottom left green icon)\nSelect ‘Connect to Host’\n\n\n\nLogin to a login node, e.g.\nlogin23-3.hpc.itc.rwth-aachen.de\n\n\n\nCheck that you are connected to the cluster\nDownload the Apptainer in the VS-Code terminal:\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nls\nSelect the CMM folder as your working directory\n\n\n\nIn the terminal, start the Jupyter server and copy the link to the Jupyter server\n\napptainer run dolfinx_latest.sif notebook\n\nClick ‘Select Kernel’\nClick ‘Existing Jupyter Server’, paste the link to the Jupyter server, change the display name (e.g. Dolfinx)\n\n\n\nSelect the ‘Python 3 (ipykernel)’ /opt/conda/envs/fenicsx-env/bin/python.\n\nDone.\n\n\n\nIf you want do develop locally, feel free to do so. There are two things to keep in mind:\n\n1. You are responsible to set things up\n\nYour submission needs run run on the environment me provide. Ensure that it there works before you submit your homework!\n\n\n\nhttps://fenicsproject.org/download/\n\n\n\n\nInstall Apptainer: https://apptainer.org/docs/admin/main/installation.html\nInstall our environment\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nInstall Paraview: https://www.paraview.org/" }, { - "objectID": "content/exercises/homework02.html#tasks-2", - "href": "content/exercises/homework02.html#tasks-2", - "title": "Homework 2", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" + "objectID": "content/wiki/how_to_homework.html#prerequisites", + "href": "content/wiki/how_to_homework.html#prerequisites", + "title": "Work you your homework in the RWTH Cluster", + "section": "", + "text": "Make sure you have an HPC Account\nIf you want to work from home, you need connect to the RWTH VPN" }, { - "objectID": "content/exercises/homework02.html#tasks-3", - "href": "content/exercises/homework02.html#tasks-3", - "title": "Homework 2", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nWe want to derive a non-parametric representation of Mohr’s Circle in 2D.\nThe transformation rule for second order tensors is given as\n\\[\n\\sigma' = \\mathbf{R} \\, \\sigma \\, \\mathbf{R}^T\n\\]\nwhere \\(\\mathbf{R}\\) is the rotation matrix\n\\[\n\\mathbf{R}(\\theta)\n=\n\\begin{pmatrix}\ncos(\\theta) & -sin(\\theta) \\\\\nsin(\\theta) & cos(\\theta) \\\\\n\\end{pmatrix}\n\\].\nProceed as follows:\n\nLet \\(\\sigma_x' = \\sigma_n\\) be the normal stress and \\(\\tau_{xy} = \\tau_{n}\\) be the shear stress. Derive a parametric representation of \\(\\sigma_n\\) and \\(\\tau_n\\) using the transformation rule given above.\nSimplify the expression by using trigonometric rules (Hint: we aim for expressions of \\(2\\theta\\))\nObtain a non-parametric expression of a circle, \\((x-a)^2 + (y-b)^2 = r^2\\).\n\n\n\nTask 2\nCompute for \\(\\mathbf{S}_1\\) using Mohr’s circle:\n\nThe maximum shear stress and the angle \\(\\theta\\)\nThe maximal normal stress and the angle \\(\\theta\\)\nThe minimal normal stress and the angle \\(\\theta\\)\n\n\n\nTask 3\nCompute the principal stresses \\((\\sigma_1, \\sigma_2, \\sigma_3)\\) of \\(\\mathbf{S}_2\\). We can now construct Mohr’s circle in 3d as follows:\n\nDraw a coordinate system \\((\\sigma_n, \\tau_n)\\)\nMark the principal stresses on the abscissa\nDraw three circles, each circle passes through two of the three principal stresses marked on the abscissa.\n\n\n\nTask 4\nCompute for \\(\\mathbf{S}_2\\) using Mohr’s circle:\n\nThe maximum shear stress.\nThe maximal normal stress and the correpsonding directional vector.\nThe minimal normal stress and the corresponding directional vector." + "objectID": "content/wiki/how_to_homework.html#helpful-pointers", + "href": "content/wiki/how_to_homework.html#helpful-pointers", + "title": "Work you your homework in the RWTH Cluster", + "section": "", + "text": "Log into the Cluster\nHow to add your SSH keys for a more convenient login\nNote that there are multiple login nodes to the RWTH Cluster." }, { - "objectID": "content/exercises/homework02.html#tasks-4", - "href": "content/exercises/homework02.html#tasks-4", - "title": "Homework 2", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDerive the weak formulation of the problem assuming that the displacement \\(\\mathbf{u} \\in H^1(\\Omega)\\) and test function \\(\\phi \\in H^1(\\Omega)\\). Make sure to differentiate between the Dirichlet and Neumann boundary term. Why is the implementation of the Dirichlet term in this weak formulation difficult?\n\n\n\n\n\n\nNote\n\n\n\nRecall the very common notation that a function space with subscript zero, e.g. \\(\\mathbb{V}_0\\) denotes compact support. For our purposes, this means that the function vanishes at the boundary.\n\n\n\n\n\n\n\n\nNote\n\n\n\nRecall from your PDE class that \\(H^1\\) denotes a Hilbert space.\n\n\n\n\n\n\n\n\nTip\n\n\n\nRecall from your PDE-class that a weak formulation is derived by multiplying your problem with a test function (e.g. denoted as \\(\\phi\\)) and integrated over the domain \\(\\Omega\\). Often, integration by parts is employed to reduce the demands on the funtional space of the solution.\nYour weak formulation always needs to be stated in a way similar to the following:\nFind \\(\\mathbf{u} \\in \\mathbb{V}\\) such that \\[\n \\begin{cases}\n & \\text{YOUR } \\\\\n & \\text{PROBLEM} \\\\\n & \\text{STATEMENT} \\\\\n \\end{cases}\n\\] \\(\\forall \\phi \\in \\mathbb{W}\\)\nWhere \\(\\phi \\in \\mathbb{W}\\) denotes the test function we used to derive the weak form.\n\n\n\n\nTask 2\nA typical solution strategy to solve the issue with the Dirichlet boundary condition is to ‘lift’ the problem. We will do this step by step\n\nConstruct a (simple) function \\(\\mathbf b(x, y)\\) that fulfills \\(\\mathbf b(0, y) = \\mathbf g_0(y)\\) and \\(\\mathbf b(1, y) = \\mathbf g_1(y)\\).\nDefine a new function \\(\\mathbf w = \\mathbf u - \\mathbf b\\)\nConsider a suitable function space for \\(w\\). What changed compared to the function space of \\(u\\)?\nSubstituve \\(\\mathbf w\\) into the strong formulation of our problem. Do not forget the boundary conditions.\nWrite down the weak formulation for the problem statement derived in 4. Make sure to choose an approriate (and useful) function space for the test function as well.\nAssume you are given the solution \\(\\mathbf w^*\\) for the weak formulation you posed in 5. Write down the solution for \\(\\mathbf u\\)." + "objectID": "content/wiki/how_to_homework.html#way-1-using-your-web-browser", + "href": "content/wiki/how_to_homework.html#way-1-using-your-web-browser", + "title": "Work you your homework in the RWTH Cluster", + "section": "", + "text": "You need to be in the network of RWTH. Use VPN if necessary.\n\n\nIn your browser, open\nhttps://login23-x-1.hpc.itc.rwth-aachen.de:3300/auth/ssh/\nand log into the cluster.\n\nCreate a session, e.g. MATE (us)\n\n\n\n(optional) You may want to download the Desktop Clients instead of using your browser.\n\n\n\n\n\n\nOpen a terminal\nDownload the Container (Apptainer) of our course, e.g.\n\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nls\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nOpen firefox\nStart a Jupyter server with\n\napptainer run dolfinx_latest.sif notebook\n\nClick the link or copy it to your browser\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nRun your python script\napptainer run dolfinx_latest.sif test.py\n\n\n\n\nT.b.d. (Currently not supported)\n\n\n\n\n\nOpen a terminal and navigate to your CMM folder.\nLoad the required module to start Paraview …\nmodule purge; \nmodule load GCC/12.3.0; \nmodule load OpenMPI/4.1.5; \nmodule load ParaView/5.11.2\n… and open Paraview\nparaview\nOpen output files that you created with FenicsX" }, { - "objectID": "content/exercises/homework02.html#tasks-5", - "href": "content/exercises/homework02.html#tasks-5", - "title": "Homework 2", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nCompute the Cauchy stress tensor \\(\\mathbf{\\sigma} \\in \\mathbb{R}^{3x3}\\) by directly solving the linear system associated with \\(\\mathbf{t}^i = \\mathbf{\\sigma} \\mathbf{n}^i\\) for \\(i=\\{1,2,3\\}\\).\n\n\n\n\n\n\nNote\n\n\n\nYou can use your computer to solve the system if you want.\n\n\n\n\nTask 2\nNow we want to solve for the stress tensor without the need to solve a linear system. You can do so by changing the coordinate system such that\n\\[\n \\mathbf{\\tilde{t}} = \\mathbf{\\tilde{\\sigma}} \\mathbf{n} = \\mathbf{\\tilde{\\sigma}} \\mathbf{e}\n\\]\nwhere \\(\\mathbf{n}\\) is an arbitrary vector of unit length and \\(\\mathbf{e}\\) is a cartesian unit vector. Then the rows of \\(\\mathbf{\\tilde{\\sigma}}\\) are given \\(\\mathbf{\\tilde{t}}\\)." + "objectID": "content/wiki/how_to_homework.html#way-2-using-vs-code", + "href": "content/wiki/how_to_homework.html#way-2-using-vs-code", + "title": "Work you your homework in the RWTH Cluster", + "section": "", + "text": "Install the ‘Remote - SSH’ Extension\n\n\n\nOpen a remove window (bottom left green icon)\nSelect ‘Connect to Host’\n\n\n\nLogin to a login node, e.g.\nlogin23-3.hpc.itc.rwth-aachen.de\n\n\n\nCheck that you are connected to the cluster\nDownload the Apptainer in the VS-Code terminal:\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nls\nSelect the CMM folder as your working directory\n\n\n\nIn the terminal, start the Jupyter server and copy the link to the Jupyter server\n\napptainer run dolfinx_latest.sif notebook\n\nClick ‘Select Kernel’\nClick ‘Existing Jupyter Server’, paste the link to the Jupyter server, change the display name (e.g. Dolfinx)\n\n\n\nSelect the ‘Python 3 (ipykernel)’ /opt/conda/envs/fenicsx-env/bin/python.\n\nDone." }, { - "objectID": "content/exercises/homework02.html#tasks-6", - "href": "content/exercises/homework02.html#tasks-6", - "title": "Homework 2", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nWe are now interessted in gaining a better understanding of the physical meaning of the theorem.\nFor that matter, proceed as follows:\n\nWrite down the Divergence Threorem while explicitly keeping track of the dependence on the spatial coordinate \\(\\mathbf{x} \\in B\\), where \\(B = (\\mathbf{y}, \\delta)\\) indicates a ball with center point \\(y\\) and radius \\(\\delta\\).\nNow we would like to rewrite the divergence term in an expansion around the center point \\(\\mathbf{y}\\) and higher order terms\nSimplify the integral by introducing \\(vol(B)\\).\nIsolate the divergence term and take the limit for \\(\\delta \\rightarrow 0\\).\nInterpret the final relation in your own words.\n\n\n\nTask 2\nGiven \\(\\Omega\\) and \\(\\partial \\Omega\\) as before, we now consider an arbitrary second-order tensor \\(\\mathbf S \\in \\mathbb{R}^{3\\times3}\\). Prove the Tensor Divergence Theorem\n\\[\n\\int_{\\Omega} \\nabla \\cdot \\mathbf S \\: d \\: \\Omega = \\int_{\\partial \\Omega} \\mathbf S \\cdot \\mathbf n \\: d \\: A\n\\tag{1}\\]\n\n\n\n\n\n\nTip\n\n\n\nMultiply (dot product) Equation 1 with an arbitrary (constant) vector. Make use of the Divergence Theorem to proof the Tensor Divergence Theorem." + "objectID": "content/wiki/how_to_homework.html#way-3-local-installation", + "href": "content/wiki/how_to_homework.html#way-3-local-installation", + "title": "Work you your homework in the RWTH Cluster", + "section": "", + "text": "If you want do develop locally, feel free to do so. There are two things to keep in mind:\n\n1. You are responsible to set things up\n\nYour submission needs run run on the environment me provide. Ensure that it there works before you submit your homework!\n\n\n\nhttps://fenicsproject.org/download/\n\n\n\n\nInstall Apptainer: https://apptainer.org/docs/admin/main/installation.html\nInstall our environment\nmkdir CMM\ncd CMM\napptainer pull oras://registry.git.rwth-aachen.de/mbd/courses/containers/dolfinx:latest\nInstall Paraview: https://www.paraview.org/" }, { - "objectID": "content/exercises/homework04.html#tasks", - "href": "content/exercises/homework04.html#tasks", - "title": "Homework 4", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nHow is the process model called?\n\n\nTask 2\nFor a constant pressure gradient \\(\\frac{\\partial p}{\\partial z} = -P\\), is the pressure greater at \\(z_0\\) or \\(z_1\\)?\n\n\nTask 3\nHow do mass and momentum balance read in cylindrical coordinates?\n\n\n\n\n\n\nTip\n\n\n\nGradient and divergence in cylindrical coordinates are given by:\n\\[\\begin{align*}\n \\nabla f & = \\frac{\\partial f}{\\partial r } \\vec{e}_r + \\frac{1}{r} \\frac{\\partial f}{\\partial \\theta} \\vec{e}_\\theta+ \\frac{\\partial f}{\\partial z} \\vec{e}_z, \\\\\n \\nabla \\cdot \\vec{A} & = \\frac{1}{r}\\frac{\\partial}{\\partial r }(r A_r) + \\frac{1}{r} \\frac{\\partial A_\\theta}{\\partial \\theta} + \\frac{\\partial A_z}{\\partial z} \\\\\n \\nabla \\times \\vec{A} & = \\left(\\frac{1}{r}\\frac{\\partial A_z}{\\partial \\theta}-\\frac{\\partial A_\\theta}{\\partial z}\\right)\\vec{e}_r+ \\left(\\frac{\\partial A_r}{\\partial z}-\\frac{\\partial A_z}{\\partial r}\\right)\\vec{e}_\\theta+\\frac{1}{r}\\left(\\frac{\\partial}{\\partial r}(r A_\\theta)-\\frac{\\partial A_r}{\\partial \\theta}\\right) \\vec{e}_z \n\\end{align*}\\]\n\n\n\n\nTask 4\nAssuming constant pressure in the cross-sectional area \\(\\frac{\\partial p}{\\partial {\\theta}} = \\frac{\\partial p}{\\partial r } = 0\\), how do mass and momentum balance reduce? What does this imply for the velocity field?\n\n\nTask 5\nFurthermore, there will be no change in the pipe’s flow field in time and no flow in radial direction or rotational direction. Hence \\(u_z = u_z(r, \\theta)\\) and \\(u_r = u_{\\theta} = 0\\). How does the remaining process model look like?\n\n\nTask 6\nDerive an explicit expression for the velocity profile. Also, derive an expression that yields the volume discharge?\n\n\nTask 7\nAssume that the pressure grdient drops by a factor of \\(50\\%\\). How can you change the setting to assure the same volume discharge?" + "objectID": "content/slides/index-student.html", + "href": "content/slides/index-student.html", + "title": "Slides", + "section": "", + "text": "Order By\n Default\n \n Date - Oldest\n \n \n Date - Newest\n \n \n Title\n \n \n Author\n \n \n \n \n \n \n \n\n\n\n\n\nDate\n\n\nTitle\n\n\nAuthor\n\n\n\n\n\n\n2025 04 07\n\n\nIntroduction\n\n\nJulia Kowalski\n\n\n\n\n2025 04 11\n\n\nFundamentals\n\n\nJulia Kowalski\n\n\n\n\n2025 04 14\n\n\nDerivatives and trajectories\n\n\nJulia Kowalski\n\n\n\n\n2025 04 14\n\n\nBalance laws\n\n\nJulia Kowalski\n\n\n\n\n\nNo matching items" }, { - "objectID": "content/exercises/homework04.html#tasks-1", - "href": "content/exercises/homework04.html#tasks-1", - "title": "Homework 4", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nDraw a sketch of the situation. Indicate all mentioned variables and the coordinate system. Explain why the velocity in both y- and z-direction vanish.\n\n\nTask 2\nDetermine an equation for the velocity profile in the fluid.\n\n\n\n\n\n\nTip\n\n\n\nThe volume flowing through a specific cross-section per unit time calculates as \\[\\begin{equation*}\n \\dot{V} = \\int_F \\vec{v}\\cdot d\\vec{F}.\n\\end{equation*}\\] Here, with the width \\(L\\), this simplifies to \\[\\begin{equation*}\n \\frac{\\dot{V}}{L} = \\int_0^a v_x dy.\n\\end{equation*}\\]\n\n\n\n\nTask 3\nDerive an equation for the volume flow rate per unit width.\n\n\nTask 4\nCalculate how much oil does the oil skimmer actually remove per unit time?" + "objectID": "content/slides/M_lubrication/index.html#towers-experiment", + "href": "content/slides/M_lubrication/index.html#towers-experiment", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Tower’s experiment", + "text": "Tower’s experiment\n\n\n\n\n\n\n\n\n\n\n\nSource: Hori (2006)\n\n\nObservations:\n\nFrictional resistance almost constant regardless the bearing load\nThe friction coefficient is very small, around 1/1000\nFrictional resistance increases with sliding speed\nFrictional resistance decreases with temperature" }, { - "objectID": "content/exercises/homework04.html#tasks-2", - "href": "content/exercises/homework04.html#tasks-2", - "title": "Homework 4", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nCompute the nondimensional version of Equation 2 using the scales\n\\[\n\\tilde{t} = t / t_0 \\quad \\tilde{x_i} = x_i / L_0 \\quad \\tilde{v_i} = v_i / U_{0} \\quad \\tilde{p} = p / p_0 \\quad.\n\\]\nYour expression should contain the following nondimensional numbers:\n\nStrouhal number \\(Str := \\frac{L_0}{t_0 \\, U_0}\\)\nReynold’s number \\(Re := \\frac{L_0 U_0}{\\nu}\\)\nMach number \\(Ma := \\frac{U_0}{a_0}\\)\n\nwhere \\(a_0\\) is the speed of sound in water. \\(a_0\\) is related to the other variables as \\(a_0^2 = \\frac{p_0}{\\rho_0}\\).\n\n\nTask 2\nAssume a steady flow with a small Mach number \\(Ma \\ll 1\\).\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\n\n\n\n\n\nNote\n\n\n\n\\(\\mathcal{o}(Ma^2)\\) indicates that all other terms are arbitrarily small compared to \\(Ma^2\\).\n\n\n\n\nTask 3\nAssume a steady flow with a small velocity \\(U_0 \\ll 1\\). Assume that all other quantities remain constant.\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\n\n\n\n\n\nTip\n\n\n\nIt makes sense to rewrite the Reynold’s number in terms of the Mach number times a constant. How is this constant defined?\n\n\n\n\nTask 4\nDescribe in your own words what the different equations model." + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\n\n\n\n\n\nSource: By Wizard191 - Own work, CC BY-SA 3.0, Wiki commons: 10279899\n\n\nGiven:\n\nRadius of the bearing / journal\nProperties of the oil\nRotation speed / angular velocity\nForce / weight of the journal\n\nWanted:\n\nEccentricity of the journal\nOil film thickness\nPressure distribution" }, { - "objectID": "content/exercises/homework06.html#tasks", - "href": "content/exercises/homework06.html#tasks", - "title": "Homework 6", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nExplain the physical meaning of the terms (I), (II), and (III) of the heat equation.\n\n\nTask 2\nGive the SI base units of \\(t\\), \\(x\\), \\(v\\), and \\(\\lambda\\).\n\n\nTask 3\nWe introduce the dimensionless variables\n\\[\n\\begin{aligned}\n t:=t_0\\tilde{t}, \\, x:=x_0\\tilde{x}, \\, v:=v_0\\tilde{v}, \\text{and } T:=\\underbrace{\\left(T_\\mathrm{wall} - T_\\mathrm{inf}\\right)}_{T_0} \\tilde{T} + T_\\mathrm{inf}.\n\\end{aligned}\n\\]\nWrite both equation Equation 1 and the boundary conditions Equation 2 in dimensionless variables. Identify the Peclet number \\(\\mathrm{Pe}=\\frac{v_0 x_0}{\\lambda}\\).\nNow consider a physical regime characterized by \\(t_0 \\gg \\frac{x_0^2}{\\lambda}\\).\n\n\nTask 4\nHow does the equation read in this physical regime?\n\n\nTask 5\nSolve for the temperature profile and sketch the solution.\n\n\nTask 6\nHow does the profile change as the thermal diffusivity decreases? Indicate it in the sketch!\n\n\nTask 7\nIf \\(\\lambda\\) doubles, how does the velocity need to change to retain the same profile?" + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-1", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-1", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\n\nRadii \\(R_b\\) and \\(R_f\\)\nRadial clearance: \\(c = R_b - R_f\\)\nEccentricity \\(e\\), \\(k = \\frac{e}{c}\\)\nAngular / polar coordinate \\(x = R_b \\phi\\)\nOil film thickness: \\(h(\\phi) \\approx c + e \\cos (\\phi)\\)\nSommerfeld boundary conditions: \\(p(0)=p(2 \\pi) = 0\\)\nReynold’s equation\n\n\\[\n\\frac{d}{dx} \\left( h^3 \\frac{d}{dx} p \\right) = 6 \\mu U \\frac{d}{dx} h\n\\]\n\n\n\n\n\n\n\nSource: Hori (2006)" }, { - "objectID": "content/exercises/homework06.html#tasks-1", - "href": "content/exercises/homework06.html#tasks-1", - "title": "Homework 6", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nInterpret the physical meaning of each of these conditions.\n\n\nTask 2\nIntroduce the similarity variable \\(\\eta := \\frac{x}{2\\sqrt{Dt}}\\) and write both temperature and mass diffusion (Equation 3), in terms of the similarity variable.\n\n\nTask 3\nThe resulting ODE system can be solved in terms of the (unknown) interface position \\(X_\\mathrm{m}=X(t)\\) and written in \\(x\\) and \\(t\\) again. Derive the solution (get inspired by the lecture).\n\n\nTask 4\nDiscuss which of the relations/boundary conditions 1. – 8. are fulfilled versus what is still unknown.\n\n\nTask 5\nMake the Ansatz: \\(X_\\mathrm{m}(t) = 2\\lambda\\sqrt{Dt}\\) (similar to lecture, but with \\(D\\) instead of \\(\\alpha\\)). Substitute the derived solutions for \\(T\\) and \\(C\\) into the Stefan condition and salt rejection and derive an algebraic system that allows us to determine \\(C_\\mathrm{i}\\), \\(T_\\mathrm{i}\\) and \\(\\lambda\\).\n\n\nTask 6\nCombine the derived equations into one equation for \\(\\lambda\\). Determine \\(\\lambda\\) for freezing sea water with \\(T_\\mathrm{B} = -10^\\circ C\\), \\(T_\\infty=2^\\circ C\\), \\(T_\\mathrm{m}=0^\\circ C\\), \\(C_\\infty=3.5\\%\\), \\(D=1.33 \\times 10^{-9}m^2s^{-1}\\) (Na-Ions in Water), \\(\\alpha_\\mathrm{ice} = 1.203 \\times 10^{9}m^2s^{-1}\\), \\(\\alpha_\\mathrm{water} = 0.14 \\times 10^{9}m^2s^{-1}\\), \\(L=334 \\times 10^{3} J\\), \\(c_p=2.05 \\times 10^{3} J kg^{-1} K^{-1}\\) and \\(m\\approx 1 K \\%^{-1}\\) (i.e., for each percent of salt the melting temperature is reduced by 1K; valid until about 20 % of salts). Plot the solution and discuss what you see." + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-2", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-2", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nSommerfeld pressure distribution (\\(R_b \\approx R_f:= R\\)):\n\\[\np(k,\\phi) = \\frac{6 \\mu U R}{c^2} \\underbrace{\\frac{k ( 2 + k \\cos \\phi) \\sin \\phi}{(2+k^2)(1+k \\cos \\phi)^2}}_{\\bar p (k,\\phi)} = \\frac{6 \\mu U R}{c^2} \\bar p (k,\\phi)\n\\]\n\n\n\n\n\n\n\n\n\n\n\n\nSource: Hori (2006)" }, { - "objectID": "content/wiki/authoring.html", - "href": "content/wiki/authoring.html", - "title": "Lecturer FAQ", - "section": "", - "text": "Project profiles allow to branch the content within one document. We will primarily use this to differentiate between student and lectuerer content (e.g. the visibility of solutions).\n\n\nDefault setting can be found in the _quarto.yml under profile > default is equivalent to exporting the environment variable\nexport QUARTO_PROFILE=\"lecturer, shallowflow-reduced\"\nIn order to generate a student version, export the following environment variable and render:\nexport QUARTO_PROFILE=\"student\"\nquarto render\nAll available options are listed in the _quarto.yml, under the profile > group keyword. The group lists indicate that we currenly use two mutually exclusive settings:\nprofile:\n default: lecturer, shallowflow-reduced\n group: \n - [lecturer, student]\n - [shallowflow-reduced, shallowflow-full]\nThe default option os always the first item in the list. However, by specifying the default argument, we make the default setting more verbose.\n\n\n\nIn order to create a Exercise with solution, you can use the following template:\n# Exercise title\nEXERCISE\n::: {.content-visible when-profile=\"lecturer\"}\nSOLUTION\n:::\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPaste your pdf in content/resources/pdfs.\nAdd a filename.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/pdfs/resource.pdf\"\n categories: [demo]\n\nAdd the resource.pdf as well as the filename.yaml to git.\n\n\n\n\nWe use Revealjs resources.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsecase: Content that has its own requirements or projects that should be accessable independently of the general toolchain.\n\n\nA presentation starts as a completely indepentent project that is only merged later. If you want start from a template, you can use the demo in content/resources/content/demo.\n\nPaste your content into as a new folder in content/resources/content (or copy the template folder).\nAdd your content into the index.qmd file.\n\n\n\n\n\nPaste your presentation into as a new folder in content/resources/content (or copy the templte folder).\nCheck that your preamble contains the following (e.g. in the _quarto.yml or in the metadata section of index.qmd):\n\n output-dir: _output\n output-file: index.html\n standalone: true\n embed-resources: true\n\n(optional) use global references: add the following to the preamble:\n\nbibliography: \n - references.bib\n - ./../../../references.bib\n\nAdd a presentationname.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/content/demo/_output/index.html\"\n categories: [demo]\n\n\n\n\n\n\nImportant\n\n\n\nThe path is critical in such that the file can be found. The rest is optional data that is shown in the listing on the webpage.\n\n\n\nCommit content/resources/content/<your new folder>/_output/index.html.\npush" + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-3", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-3", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nThe hydrodynamic oil film force \\(P\\) has to balance the bearing load \\(P_1\\)\nThis gives rise to the following componentwise force balance relations in eccentricity direction and perpendicular to it:\n\\[\nL R \\int_0^{2 \\pi} p(k,\\phi) \\cos \\phi d \\phi + P_1 \\cos \\theta = 0\n\\]\n\\[\nL R \\int_0^{2 \\pi} p(k,\\phi) \\sin \\phi d \\phi - P_1 \\sin \\theta = 0\n\\]\nin which \\(L\\) denotes the length of the bearing.\n\n\n\n\n\n\n\nSource: Hori (2006)" }, { - "objectID": "content/wiki/authoring.html#authoring", - "href": "content/wiki/authoring.html#authoring", - "title": "Lecturer FAQ", - "section": "", - "text": "Project profiles allow to branch the content within one document. We will primarily use this to differentiate between student and lectuerer content (e.g. the visibility of solutions).\n\n\nDefault setting can be found in the _quarto.yml under profile > default is equivalent to exporting the environment variable\nexport QUARTO_PROFILE=\"lecturer, shallowflow-reduced\"\nIn order to generate a student version, export the following environment variable and render:\nexport QUARTO_PROFILE=\"student\"\nquarto render\nAll available options are listed in the _quarto.yml, under the profile > group keyword. The group lists indicate that we currenly use two mutually exclusive settings:\nprofile:\n default: lecturer, shallowflow-reduced\n group: \n - [lecturer, student]\n - [shallowflow-reduced, shallowflow-full]\nThe default option os always the first item in the list. However, by specifying the default argument, we make the default setting more verbose.\n\n\n\nIn order to create a Exercise with solution, you can use the following template:\n# Exercise title\nEXERCISE\n::: {.content-visible when-profile=\"lecturer\"}\nSOLUTION\n:::" + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-4", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-4", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nThe hydrodynamic oil film force \\(P\\) has to balance the bearing load \\(P_1\\)\nThis gives rise to the following componentwise force balance relations in eccentricity direction and perpendicular to it:\n\\[\n\\underbrace{L R \\int_0^{2 \\pi} p(k,\\phi) \\cos \\phi d \\phi}_{=0} + P_1 \\cos \\theta = 0\n\\]\nThis means\n\\[\nP_1 \\cos \\theta = 0 \\quad \\Rightarrow \\theta = \\frac{\\pi}{2}\n\\]\n\n\n\n\n\n\n\nSource: Hori (2006)" }, { - "objectID": "content/wiki/authoring.html#adding-a-pdf", - "href": "content/wiki/authoring.html#adding-a-pdf", - "title": "Lecturer FAQ", - "section": "", - "text": "Paste your pdf in content/resources/pdfs.\nAdd a filename.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/pdfs/resource.pdf\"\n categories: [demo]\n\nAdd the resource.pdf as well as the filename.yaml to git." + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-5", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-5", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nThe hydrodynamic oil film force \\(P\\) has to balance the bearing load \\(P_1\\)\nThis gives rise to the following componentwise force balance relations in eccentricity direction and perpendicular to it:\n\\[\nL R \\int_0^{2 \\pi} p(k,\\phi) \\sin \\phi d \\phi - P_1 \\sin \\theta = 0\n\\]\n\\[\n\\Rightarrow P_1 = \\mu U L \\left( \\frac{R}{c} \\right)^2 \\frac{12 \\pi k}{(2 + k^2) (1 - k^2)^{1/2}}\n\\]\n\n\n\n\n\n\n\nSource: Hori (2006)" }, { - "objectID": "content/wiki/authoring.html#adding-a-new-presentation", - "href": "content/wiki/authoring.html#adding-a-new-presentation", - "title": "Lecturer FAQ", - "section": "", - "text": "We use Revealjs resources.\n\n\n\n\n\n\n\n\nNote\n\n\n\nUsecase: Content that has its own requirements or projects that should be accessable independently of the general toolchain.\n\n\nA presentation starts as a completely indepentent project that is only merged later. If you want start from a template, you can use the demo in content/resources/content/demo.\n\nPaste your content into as a new folder in content/resources/content (or copy the template folder).\nAdd your content into the index.qmd file.\n\n\n\n\n\nPaste your presentation into as a new folder in content/resources/content (or copy the templte folder).\nCheck that your preamble contains the following (e.g. in the _quarto.yml or in the metadata section of index.qmd):\n\n output-dir: _output\n output-file: index.html\n standalone: true\n embed-resources: true\n\n(optional) use global references: add the following to the preamble:\n\nbibliography: \n - references.bib\n - ./../../../references.bib\n\nAdd a presentationname.yaml file into content/resources/listing/ with content similar to be one below:\n\n title: \"Demo\"\n author: Ingo Steldermann\n date: 2024-04-05\n path: \"/content/resources/content/demo/_output/index.html\"\n categories: [demo]\n\n\n\n\n\n\nImportant\n\n\n\nThe path is critical in such that the file can be found. The rest is optional data that is shown in the listing on the webpage.\n\n\n\nCommit content/resources/content/<your new folder>/_output/index.html.\npush" + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-6", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-6", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\nIntroducing the Sommerfeld Number\n\\[\nS:= \\frac{\\mu N}{p_m} \\left( \\frac{R}{c} \\right)^2\n\\]\nin terms of bearing pressure \\(p_m:= P_1 / (2 R L)\\) and number of revolutions \\(N := U/(2 \\pi R)\\).\nWe get\n\\[\n\\frac{1}{S} = \\frac{12 \\pi k}{(2 + k^2) (1 - k^2)^{1/2}}\n\\]\nJournal bearings with similar Sommerfeld Number \\(S\\) operate under similar conditions!" }, { - "objectID": "content/wiki/index.html", - "href": "content/wiki/index.html", - "title": "Wiki", - "section": "", - "text": "Your browser might not show the updated content of the webpage by default. Please ensure that you empty the cache for this webpage before using it. Potential keyboard shortcuts for:\n\nGoogle Chrome/Firefox: CTRL + F5.\nSafari (11.1 and above): CTRL + OPTION + F5\nMirosoft Edge: CTRL + F5", - "crumbs": [ - "Wiki" - ] + "objectID": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-7", + "href": "content/slides/M_lubrication/index.html#lubrication-in-a-journal-bearing-7", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Lubrication in a journal bearing", + "text": "Lubrication in a journal bearing\n\n\n\n\n\n\n\n\n\n\n\nSource: By Wizard191 - Own work, CC BY-SA 3.0, Wiki commons: 10279899\n\n\nGiven:\n\nRadius of the bearing / journal \\(R,c\\)\nProperties of the oil \\(\\mu\\)\nRotation speed / angular velocity \\(N\\)\nForce / weight of the journal \\(P_1\\)\n\\(S:= \\frac{\\mu N}{p_m} \\left( \\frac{R}{c} \\right)^2\\)\n\nWanted:\n\nEccentricity: Sommerfeld solution!\nOil film thickness: Ansatz\nPressure distribution: Reynolds equation" }, { - "objectID": "content/wiki/index.html#faq", - "href": "content/wiki/index.html#faq", - "title": "Wiki", - "section": "", - "text": "Your browser might not show the updated content of the webpage by default. Please ensure that you empty the cache for this webpage before using it. Potential keyboard shortcuts for:\n\nGoogle Chrome/Firefox: CTRL + F5.\nSafari (11.1 and above): CTRL + OPTION + F5\nMirosoft Edge: CTRL + F5", - "crumbs": [ - "Wiki" - ] + "objectID": "content/slides/M_lubrication/index.html#references", + "href": "content/slides/M_lubrication/index.html#references", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "References", + "text": "References\n\n\n\n\nHori, Y. 2006. “Hydrodynamic Lubrication.”" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", - "href": "content/slides/M_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", + "objectID": "content/slides/W_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", + "href": "content/slides/W_linear_elasticity/index.html#a-seismic-survey-to-investigate-the-subsurface", "title": "Continuum Mechanical Modeling for Simulation Science", "section": "A seismic survey to investigate the subsurface", - "text": "A seismic survey to investigate the subsurface\n\n\n\n\n\n\nBoxberg (2023)" + "text": "A seismic survey to investigate the subsurface" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#how-do-we-get-information-on-relevant-material-properties", - "href": "content/slides/M_linear_elasticity/index.html#how-do-we-get-information-on-relevant-material-properties", + "objectID": "content/slides/W_linear_elasticity/index.html#how-to-simulate", + "href": "content/slides/W_linear_elasticity/index.html#how-to-simulate", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "How do we get information on relevant material properties?", - "text": "How do we get information on relevant material properties?\n\n\n\n\n\n\nBoxberg (2023)" + "section": "How to simulate?", + "text": "How to simulate?\nThe simplest numerical solution of the wave equation\n\\[\\frac{\\partial^2}{\\partial t^2} \\mathbf w = c \\, \\frac{\\partial^2}{\\partial x^2} \\mathbf w\\]\nis done by means of finite difference approximations" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#what-does-the-detected-signal-tell-us", - "href": "content/slides/M_linear_elasticity/index.html#what-does-the-detected-signal-tell-us", + "objectID": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-1", + "href": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "What does the detected signal tell us?", - "text": "What does the detected signal tell us?\n\n\n\n\n\n\nBoxberg (2023)" + "section": "Simulation of a 1d wave propagation at wave speed 1", + "text": "Simulation of a 1d wave propagation at wave speed 1\n\n\n\n\n\n\n\n\n\nFigure 1: Space-time plot at wave speed 1" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#how-does-the-simulation-compare", - "href": "content/slides/M_linear_elasticity/index.html#how-does-the-simulation-compare", + "objectID": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-0.5", + "href": "content/slides/W_linear_elasticity/index.html#simulation-of-a-1d-wave-propagation-at-wave-speed-0.5", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "How does the simulation compare?", - "text": "How does the simulation compare?\n\n\n\n\n\n\nBoxberg (2023)" + "section": "Simulation of a 1d wave propagation at wave speed 0.5", + "text": "Simulation of a 1d wave propagation at wave speed 0.5\n\n\n\n\n\n\n\n\n\nFigure 2: Space-time plot at wave speed 0.5" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation", - "href": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation", + "objectID": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-a-1d-wave-propagation", + "href": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-a-1d-wave-propagation", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Deep-dive into the simulated wave propagation", - "text": "Deep-dive into the simulated wave propagation\n\n\n\n\n\n\nBoxberg (2023)" + "section": "Animated simulation of a 1d wave propagation", + "text": "Animated simulation of a 1d wave propagation\n\n\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 3: Wave animation of wave with speed 1" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation-1", - "href": "content/slides/M_linear_elasticity/index.html#deep-dive-into-the-simulated-wave-propagation-1", + "objectID": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-two-1d-superposed-waves", + "href": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-two-1d-superposed-waves", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Deep-dive into the simulated wave propagation", - "text": "Deep-dive into the simulated wave propagation\n\n\n\n\n\n\nBoxberg (2023)" + "section": "Animated simulation of two 1d superposed waves", + "text": "Animated simulation of two 1d superposed waves\n\n\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 4: Wave animation at superposed waves with wave speed \\((1, 0.5)\\)" }, { - "objectID": "content/slides/M_linear_elasticity/index.html#reference", - "href": "content/slides/M_linear_elasticity/index.html#reference", + "objectID": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-1d-single-and-superposed-waves", + "href": "content/slides/W_linear_elasticity/index.html#animated-simulation-of-1d-single-and-superposed-waves", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Reference", - "text": "Reference\n\n\n\n\nBoxberg, Marc S. 2023. “Wave Propagation in Lab Experiment, Boxberg@gim.rwth-Aachen.de.”" + "section": "Animated simulation of 1d single and superposed waves", + "text": "Animated simulation of 1d single and superposed waves\n\n\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 5: Wave animation of single and superposed wave" }, { - "objectID": "content/slides/M_porous_media/index.html#flow-through-porous-media-is-governed-by-darcys-law", - "href": "content/slides/M_porous_media/index.html#flow-through-porous-media-is-governed-by-darcys-law", + "objectID": "content/slides/W_linear_elasticity/index.html#references", + "href": "content/slides/W_linear_elasticity/index.html#references", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Flow through porous media is governed by Darcy’s law", - "text": "Flow through porous media is governed by Darcy’s law\n \nSource left: https://serc.carleton.edu/integrate/teaching_materials/water_science_society/student_materials/926 Source right: https://pressbooks.cuny.edu/gorokhovich/chapter/porosity-and-permeability-darcy-law/" + "section": "References", + "text": "References" }, { - "objectID": "content/slides/M_porous_media/index.html#needed-technique-to-determine-macroscale-process", - "href": "content/slides/M_porous_media/index.html#needed-technique-to-determine-macroscale-process", + "objectID": "content/slides/balance-laws/index.html#integral-continuity", + "href": "content/slides/balance-laws/index.html#integral-continuity", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Needed: Technique to determine macroscale process", - "text": "Needed: Technique to determine macroscale process\n \nSource left: Cross-section through a fiber-reinforced composite with two orientations\n(University of Augsburg)" + "section": "Integral continuity", + "text": "Integral continuity\nLet’s look at a specific quantity \\(\\Psi\\) in an arbitrary volume \\(\\mathcal C\\). We can think of it as mass per unit volume, or energy per unit volume, etc. Assuming continuity or local conservation means\n\n\\(\\Psi\\) can increase (decrease) according to influx (outflux) \\(\\mathbf F\\)\n\\(\\Psi\\) can increase (decrease) according to production (decay) \\(\\mathbf S\\)\nthere is no other mechanism\n\n\nTranslated into equations, this yields\n\\[\n\\begin{aligned}\n\\underbrace{\\frac{d}{dt} \\int_{\\mathcal C} \\Psi d \\mathbf x}_{ \\text{ rate of change of $\\Psi$ in $\\mathcal C$}} &= \\underbrace{- \\int_{\\partial \\mathcal C} \\mathbf F \\cdot \\mathbf n d \\mathbf \\sigma}_{ \\text{ in-/outflow across the surface (1.)}}\n+ \\underbrace{ \\int_{\\mathcal C} \\mathbf S d \\mathbf x}_{ \\text{ production/decay in (2.)}}\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/M_porous_media/index.html#lets-start-simple-solve-directly", - "href": "content/slides/M_porous_media/index.html#lets-start-simple-solve-directly", + "objectID": "content/slides/balance-laws/index.html#divergence-theorem", + "href": "content/slides/balance-laws/index.html#divergence-theorem", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Let’s start simple: Solve directly", - "text": "Let’s start simple: Solve directly\n\n\n\n\n\nStationary diffusion at fixed boundary conditions:\n\\[\n\\begin{aligned}\n \\frac{d}{dx} \\left( a^\\epsilon(x) \\frac{d}{dx} u^\\epsilon (x) \\right) & = 0 \\qquad \\text{for} \\quad 0 \\leq x \\leq L\n\\end{aligned}\n\\]\nwith an oscillating model parameter\n\\[\n\\begin{aligned}\n a^\\epsilon(x) &= \\frac{1}{1 + 2 \\sin^2 (\\pi x / \\epsilon)}\n\\end{aligned}\n\\]" + "section": "Divergence theorem", + "text": "Divergence theorem\nApplying the so-called divergence theorem yields an integral formulation with only volume integrals \\[\n\\begin{aligned}\n\\frac{d}{dt} \\int_{\\mathcal C} \\Psi d \\mathbf x & = - \\int_{\\mathcal C} \\nabla \\cdot \\mathbf F d \\mathbf x + \\int_{\\mathcal C} \\mathbf S d \\mathbf x\n\\end{aligned}\n\\]\n\nand since \\(\\mathcal C\\) is an arbitrary control volume, we yield the strong formulation \\[\n\\begin{aligned}\n\\partial_t \\Psi & = - \\nabla \\cdot \\mathbf F + \\mathbf S\n\\end{aligned}\n\\]\n\n\nNote, that the time derivative now comes as a partial derivative, as \\(\\Psi\\) may vary with space, and \\(\\nabla\\) stands for the Hamilton vectorial operator “nabla”, in index notation \\(\\nabla = \\mathbf{e}_i \\partial_i\\), where \\[\n\\begin{aligned}\n\\nabla f = \\text{grad} f , \\quad\n\\nabla \\cdot f = \\text{div} f ,\\quad \\text{and} \\quad\n\\nabla \\times f = \\text{curl} f .\n\\end{aligned}\n\\]\nThe strong formulation also assumes differentiability of \\(\\Psi, \\mathbf F\\), and \\(\\mathbf S\\)." }, { - "objectID": "content/slides/M_porous_media/index.html#consider-the-properties-of-the-parameter", - "href": "content/slides/M_porous_media/index.html#consider-the-properties-of-the-parameter", + "objectID": "content/slides/balance-laws/index.html#transport", + "href": "content/slides/balance-laws/index.html#transport", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Consider the properties of the parameter", - "text": "Consider the properties of the parameter\n\n\n\n\n\nWe are interested in the limit \\(\\epsilon \\Rightarrow 0\\)!\nChallenge: The parameter does not converge (pointwise)!" + "section": "Transport", + "text": "Transport\nThe two basic types of transport fluxes are:\n\nAdvective transport at velocity \\(\\mathbf v\\), hence \\(\\mathbf F = \\Psi \\mathbf v\\), and\nDiffusive transport with a diffusive flux \\(\\mathbf F = \\mathbf J\\), for instance given as gradient-driven transport \\(\\mathbf J = - D \\nabla \\Psi\\), in which \\(D\\) stands for the diffusion coefficient (Fourier’s law / Fick’s law)\n\nWe now get in operator notation:\n\\[\n\\begin{aligned}\n\\partial_t \\Psi + \\nabla \\cdot \\left( \\Psi \\mathbf v \\right) & = - \\nabla \\cdot \\mathbf J + S\n\\end{aligned}\n\\]\n\n\nIf \\(\\Psi\\) is a scalar then \\(\\nabla \\Psi\\) is a vector.\nThe diffusion coefficient can be a scalar \\(D\\) or a second order tensor \\(\\mathbf D\\) (anisotropic diffusion). Both \\(D \\nabla \\Psi\\) and \\(\\mathbf D \\nabla \\Psi\\) will be vectors.\nIn each case \\(\\nabla \\cdot D \\nabla \\Psi\\) and \\(\\nabla \\cdot \\mathbf D \\nabla \\Psi\\) will be a scalar again. It has the same dimension as \\(\\Psi\\)." }, { - "objectID": "content/slides/M_porous_media/index.html#solution-solve-for-a-sequence-of-parameters", - "href": "content/slides/M_porous_media/index.html#solution-solve-for-a-sequence-of-parameters", + "objectID": "content/slides/balance-laws/index.html#notation-in-components", + "href": "content/slides/balance-laws/index.html#notation-in-components", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Solution: Solve for a sequence of parameters", - "text": "Solution: Solve for a sequence of parameters\n\n\n\n\n\nObservation: The numerical solution seems to converge!\nWe postulate \\(\\lim_{\\epsilon \\rightarrow 0} u^\\epsilon (x) = x\\)!" + "section": "Notation in components", + "text": "Notation in components\nIt is an informative exercise to spell out the generic balance law in components.\nFor a scalar specific quantity \\(\\Psi\\) and a scalar diffusion coefficient \\(D\\), the componentwise balance law reads:\n\\[\n\\begin{aligned}\n\\partial_t \\Psi \n&+ \\partial_x \\left( \\Psi v_x \\right)\n+ \\partial_y \\left( \\Psi v_y \\right)\n+ \\partial_z \\left( \\Psi v_z \\right) \\\\[1em]\n& = \\partial_x \\left( D \\partial_x \\Psi \\right)\n+ \\partial_y \\left( D \\partial_y \\Psi \\right)\n+ \\partial_z \\left( D \\partial_z \\Psi \\right)\n+ S\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/M_porous_media/index.html#mathematical-homogenization", - "href": "content/slides/M_porous_media/index.html#mathematical-homogenization", + "objectID": "content/slides/balance-laws/index.html#notation-in-components-1", + "href": "content/slides/balance-laws/index.html#notation-in-components-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Mathematical homogenization", - "text": "Mathematical homogenization\nIdea 1: Identify macro-scale \\(L\\), micro-scale \\(l\\) and introduce scaling\n\\[\n\\begin{equation*}\ny := \\frac{L}{l} x = \\frac{x}{\\epsilon} \\qquad \\text{in which} \\quad \\epsilon := \\frac{l}{L}\n\\end{equation*}\n\\]\nIdea 2: Interpret functions as two-scale and make asymptotic expansion Ansatz:\n\\[\n\\begin{equation*}\nf^\\epsilon = f(x,y) = \\sum_{i=0}^n \\epsilon^i f^{(i)}(x,y) = f^{(0)}(x,y) + \\epsilon^1 f^{(1)}(x,y) + \\epsilon^2 f^{(2)}(x,y) + \\mathcal O (\\epsilon^3)\n\\end{equation*}\n\\]\nDifferentiation with respect to \\(x\\) then translates according to:\n\\[\n\\begin{aligned}\n\\frac{d}{dx} u(x,y) &= \\frac{d}{dx} u\\left(x,y(x)\\right) \\\\\n&= \\partial_x u(x,y) + \\partial_y u(x,y) \\underbrace{\\frac{d}{dx}y(x)}_{= \\epsilon^{-1}}\n= \\partial_x u + \\epsilon^{-1} \\partial_y u\n\\end{aligned}\n\\]" + "section": "Notation in components", + "text": "Notation in components\nDiffusion might differs with orientation. The diffusion coefficient is then given as a second order tensor. Hence\n\\[\n\\begin{aligned}\n\\mathbf D = \\left( \\begin{array}{ccc} d_{xx} & d_{xy} & d_{xz} \\\\ d_{yx} & d_{yy} & d_{yz} \\\\ d_{zx} & d_{zy} & d_{zz} \\end{array} \\right)\n\\Rightarrow\n\\mathbf D \\nabla \\Psi = \\left( \\begin{array}{ccc} d_{xx} \\partial_x \\Psi &+ d_{xy} \\partial_y \\Psi &+ d_{xz} \\partial_z \\Psi \\\\ d_{yx} \\partial_x \\Psi &+ d_{yy} \\partial_y \\Psi &+ d_{yz} \\partial_z \\Psi \\\\ d_{zx} \\partial_x \\Psi &+ d_{zy} \\partial_y \\Psi &+ d_{zz} \\partial_z \\Psi \\end{array} \\right)\n\\end{aligned}\n\\]\nIn this case, the balance law written in components reads\n\\[\n\\begin{aligned}\n\\partial_t \\Psi \n+ \\partial_x \\left( \\Psi v_x \\right)\n+ \\partial_y \\left( \\Psi v_y \\right)\n+ \\partial_z \\left( \\Psi v_z \\right) \n=\n\\partial_x & \\left( d_{xx} \\partial_x \\Psi\n+ d_{xy} \\partial_y \\Psi\n+ d_{xz} \\partial_z \\Psi \\right) \\\\\n+ \\partial_y & \\left( d_{yx} \\partial_x \\Psi\n+ d_{yy} \\partial_y \\Psi\n+ d_{yz} \\partial_z \\Psi \\right) \\\\\n+ \\partial_z & \\left( d_{zx} \\partial_x \\Psi\n+ d_{zy} \\partial_y \\Psi\n+ d_{zz} \\partial_z \\Psi \\right)\n+ S\n\\end{aligned}\n\\]\nIn index notation, finally, the (scalar) balance law can be written concicely as\n\\[\n\\begin{aligned}\n\\partial_t \\Psi + \\partial_i \\Psi v_i & = \\partial_i d_{ij} \\partial_j \\Psi + S\n\\end{aligned}\n\\]" }, { - "objectID": "content/slides/M_porous_media/index.html#mathematical-homogenization-1", - "href": "content/slides/M_porous_media/index.html#mathematical-homogenization-1", + "objectID": "content/slides/balance-laws/index.html#mass-balance", + "href": "content/slides/balance-laws/index.html#mass-balance", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Mathematical homogenization", - "text": "Mathematical homogenization\nSubstitution yields\n\\[\n\\begin{align*}\n& \\quad \\frac{d}{dx} \\left( a(y) \\frac{d}{dx} \\left(u^{(0)} + \\epsilon u^{(1)} + \\epsilon^2 u^{(2)}\\right) \\right) \\\\\n& = \\frac{d}{dx} \\left( a(y) \\left(\\partial_x u^{(0)} + \\epsilon^{-1} \\partial_y u^{(0)} + \\epsilon \\partial_x u^{(1)} + \\partial_y u^{(1)} + \\epsilon^2 \\partial_x u^{(2)} + \\epsilon \\partial_y u^{(2)}\\right) \\right)\\\\\n% first line\n& = \\underbrace{\\partial_x \\left( a(y) \\, \\partial_x u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^0} +\n\\underbrace{\\epsilon^{-1}\\,\\partial_y \\left( a(y) \\, \\partial_x u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^{-1}} +\n\\underbrace{\\epsilon^{-1}\\,\\partial_x \\left( a(y) \\, \\partial_y u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^{-1}} +\n\\underbrace{\\epsilon^{-2}\\,\\partial_y \\left( a(y) \\, \\partial_y u^{(0)} \\right)}_{\\text{order} \\; \\epsilon^{-2}} +\\\\\n% second line\n& + \\underbrace{\\epsilon \\, \\partial_x \\left( a(y) \\, \\partial_x u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^1} +\n\\underbrace{\\partial_y \\left( a(y) \\, \\partial_x u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^{0}} +\n\\underbrace{\\partial_x \\left( a(y) \\, \\partial_y u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^{0}} +\n\\underbrace{\\epsilon^{-1}\\,\\partial_y \\left( a(y) \\, \\partial_y u^{(1)} \\right)}_{\\text{order} \\; \\epsilon^{-1}} +\\\\\n% third line\n& + \\underbrace{\\epsilon^2 \\, \\partial_x \\left( a(y) \\, \\partial_x u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^2} +\n\\underbrace{\\epsilon \\,\\partial_y \\left( a(y) \\, \\partial_x u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^{1}} +\n\\underbrace{\\epsilon \\,\\partial_x \\left( a(y) \\, \\partial_y u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^{1}} +\n\\underbrace{\\partial_y \\left( a(y) \\, \\partial_y u^{(2)} \\right)}_{\\text{order} \\; \\epsilon^{0}} +\n\\end{align*}\n\\]" + "section": "Mass balance", + "text": "Mass balance\nWe consider as a specific, conserved quantity mass and accordingly choose\n\\[\\Psi = \\rho\\]\nhence mass per unit volume.\nIn addition, we choose\n\\[\n\\mathbf J = 0 \\quad \\text{and} \\quad \\mathbf S = 0.\n\\]\nThis yields the well known mass balance:\n\\[\n\\partial_t \\rho + \\nabla \\cdot \\left( \\rho \\mathbf v \\right) = 0\n\\]" }, { - "objectID": "content/slides/M_porous_media/index.html#mathematical-homogenization-2", - "href": "content/slides/M_porous_media/index.html#mathematical-homogenization-2", + "objectID": "content/slides/balance-laws/index.html#momentum-balance", + "href": "content/slides/balance-laws/index.html#momentum-balance", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Mathematical homogenization", - "text": "Mathematical homogenization\nRe-ordering in powers of \\(\\epsilon\\) yields\n\\[\n\\begin{align*}\n\\mathcal O \\left(\\epsilon^{-2}\\right): \\quad &\\partial_y \\left( a(y) \\, \\partial_y u^{(0)} \\right) = 0 \\\\\n\\mathcal O \\left(\\epsilon^{-1}\\right): \\quad &\\partial_x \\left( a(y) \\, \\partial_y u^{(0)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_x u^{(0)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_y u^{(1)} \\right) = 0\\\\\n\\mathcal O \\left(\\epsilon^{0}\\right): \\quad &\\partial_x \\left( a(y) \\, \\partial_x u^{(0)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_x u^{(1)} \\right) +\n\\partial_x \\left( a(y) \\, \\partial_y u^{(1)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_y u^{(2)} \\right) = 0\\\\\n\\mathcal O \\left(\\epsilon^{1}\\right): \\quad &\\partial_x \\left( a(y) \\, \\partial_x u^{(1)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_x u^{(2)} \\right) +\n\\partial_x \\left( a(y) \\, \\partial_y u^{(2)} \\right) +\n\\partial_y \\left( a(y) \\, \\partial_y u^{(3)} \\right) = 0\n\\end{align*}\n\\]\nBoundary conditions on both scales are\n\\[\n\\begin{align*}\n&u^{(0)} (0,y) = 0 \\qquad u^{(0)} (1,y) = 1 \\\\\n&u^{(i)} (0,y) = 0 \\qquad u^{(i)} (1,y) = 0 \\qquad &\\text{for all} \\; i \\geq 1 \\\\\n&u^{(i)} (x,0) = u^{(i)} (x,1) \\qquad &\\text{for all} \\; i \\geq 0 \\\\\n&\\partial_y u^{(i)} (0,y) = \\partial_y u^{(i)} (1,y) = 0 \\qquad &\\text{for all} \\; i \\geq 0\n\\end{align*}\n\\]" + "section": "Momentum balance", + "text": "Momentum balance\nWe consider momentum as the conserved, specific quantity, hence\n\\[\n\\Psi = \\rho \\mathbf v\n\\] as momentum per unit volume.\nIn addition we set\n\\[\n\\mathbf J = \\mathbf \\sigma \\quad \\text{and} \\quad \\mathbf S = \\rho \\mathbf b,\n\\]\nin which \\(\\mathbf b\\) is a body force and \\(\\mathbf \\sigma\\) is the Cauchy stress tensor.\nIn our course the body force \\(\\mathbf b\\) is often given as the force due to gravitational acceleration denoted by \\(\\mathbf g\\)." }, { - "objectID": "content/slides/M_porous_media/index.html#solve-step-by-step", - "href": "content/slides/M_porous_media/index.html#solve-step-by-step", + "objectID": "content/slides/balance-laws/index.html#momentum-balance-1", + "href": "content/slides/balance-laws/index.html#momentum-balance-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Solve step by step", - "text": "Solve step by step\nStep 1: We observe that \\(u^{(0)}\\) independent of \\(y\\) is a solution to the largest scale:\n\\[\nu^{(0)}(x,y) = u^{(0)}(x)\n\\]\nStep 2: Substituting the latter into the \\(\\epsilon^{-1}\\) yields \\[\n\\begin{align*}\n \\underbrace{\\partial_y \\left( a(y) \\, \\partial_x u^{(0)} \\right)}_{\\left( \\partial_y a(y) \\right) \\partial_x u^{(0)} +\n \\underbrace{a(y) \\partial_{yx} u^{(0)}}_{=0}} +\n \\partial_y \\left( a(y) \\, \\partial_y u^{(1)} \\right) = 0.\n\\end{align*}\n\\]\nNote, that with \\(u^{(1)}\\) defined according to \\[\n\\begin{align*}\nu^{(1)}(x,y) = \\left( \\frac{\\int_0^y \\frac{1}{a(\\tilde y)} d\\tilde y}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} - y + c\\right) \\partial_x u^{(0)} + f(x)\n\\end{align*}\n\\]\nthis equation is fulfilled." + "section": "Momentum balance", + "text": "Momentum balance\nAll in all, this yields the well known momentum balance:\n\\[\n\\partial_t ( \\rho \\mathbf v )\n+ \\nabla \\cdot \\left(\\rho \\mathbf v \\otimes \\mathbf v \\right) \n= \\nabla \\cdot \\mathbf \\sigma\n+ \\rho \\mathbf b\n\\]\nwith terms:\n\n\\(\\partial_t ( \\rho \\mathbf v )\\) : local change of momentum per unit volume\n\\(\\nabla \\cdot \\left( \\rho \\mathbf v \\otimes \\mathbf v \\right)\\) :influx/outflux of momentum into control volume due to advective transport\n\\(\\nabla \\cdot \\mathbf \\sigma\\) : force action of the ambient continuous medium through its boundary (examples: stretched rod, fluid at rest)\n\\(\\rho \\mathbf b\\) : total mass force acting on the medium, e.g. gravitational force" }, { - "objectID": "content/slides/M_porous_media/index.html#solve-step-by-step-1", - "href": "content/slides/M_porous_media/index.html#solve-step-by-step-1", + "objectID": "content/slides/balance-laws/index.html#momentum-balance-2", + "href": "content/slides/balance-laws/index.html#momentum-balance-2", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Solve step by step", - "text": "Solve step by step\nStep 3: Integrate the \\(\\epsilon\\) scale over a periodic cell \\(Y\\): \\[\n\\begin{align*}\n& \\int_0^1 \\partial_x \\left( a(y) \\partial_x u^{(0)} \\right) d y +\n\\underbrace{\\int_0^1 \\partial_y \\left( a(y) \\, \\partial_x u^{(1)} \\right) d y}_{[a(y) \\partial_x u^{(1)}]_0^1 = 0} \\\\\n& + \\int_0^1 \\partial_x \\left( a(y) \\partial_y u^{(1)} \\right) d y +\n\\underbrace{\\int_0^1 \\partial_y \\left( a(y) \\partial_y u^{(2)} \\right) d y}_{[a(y) \\partial_y u^{(2)}]_0^1 = 0}\n\\end{align*}\n\\]\nwhere we observe several terms to cancel out due to the micro-scale periodicity.The following two terms remain: \\[\n\\begin{align*}\n\\int_0^1 \\partial_x \\left( a(y) \\partial_x u^{(0)} \\right) + \\partial_x \\left( a(y) \\partial_y u^{(1)} \\right) d y\n\\end{align*}\n\\]" + "section": "Momentum balance", + "text": "Momentum balance\nWe can use the mass balance to re-write momentum balance as\n\\[\n\\partial_t \\mathbf v + \\left( \\mathbf v \\cdot \\nabla \\right) \\mathbf v = \\tfrac{1}{\\rho} \\nabla \\cdot \\mathbf \\sigma + \\mathbf b\n\\]\nIdentifying the total derivative yields\n\\[\n\\frac{D}{Dt} \\mathbf v = \\tfrac{1}{\\rho} \\nabla \\cdot \\mathbf \\sigma + \\mathbf b,\n\\]\nwhich mimicks Newton’s second law." }, { - "objectID": "content/slides/M_porous_media/index.html#solve-step-by-step-2", - "href": "content/slides/M_porous_media/index.html#solve-step-by-step-2", + "objectID": "content/slides/fundamentals/index.html#material-and-particle-point", + "href": "content/slides/fundamentals/index.html#material-and-particle-point", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Solve step by step", - "text": "Solve step by step\nSubstituting in \\(u^{(1)}\\) as defined before finally yields\n\\[\n\\begin{align*}\n& \\int_0^1 \\partial_x \\left( a(y) \\partial_x u^{(0)} \\right) + \\partial_x \\left( a(y) \\left( \\left( \\frac{\\frac{1}{a( y)}}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} - 1 \\right) \\partial_x u^{(0)} \\right) \\right) d y \\\\\n= & \\int_0^1 \\partial_x \\left( \\frac{1}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} \\partial_x u^{(0)} \\right) d y =\n\\partial_x \\left(\\underbrace{\\int_0^1 \\frac{1}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} d y }_{=:a^{(0)}}\\right) \\partial_x u^{(0)} \\\\\n= & \\frac{d}{dx} \\left( a^{(0)} \\frac{d}{dx} u^{(0)} \\right).\n\\end{align*}\n\\]" + "section": "Material and particle point", + "text": "Material and particle point\n\n\n\n\n\n\nNote\n\n\nSee drawing during class!\n\n\n\nIn order to predict the motion, deformation and phase-transition of a material, we think of it as an idealized medium that is continuously filling a region in three-dimensional space.\nWe discriminate a particle point and a material point:\n\nmaterial point: the “exact” position within the medium with its micro-scale properties\nparticle point: an intermediate-scale position within the medium that has all its properties\n\n\nOpen question:\nThe particle point seems to be larger than a material point, yet from a continuum mechanical perspective, a particle point should be infinitesimally small, such that we can translate reality into mathematical models.\nHow can we formalize this concept?" }, { - "objectID": "content/slides/M_porous_media/index.html#solution", - "href": "content/slides/M_porous_media/index.html#solution", + "objectID": "content/slides/fundamentals/index.html#intermediate-asymptotics", + "href": "content/slides/fundamentals/index.html#intermediate-asymptotics", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Solution", - "text": "Solution\nFor our particular example, we get \\(\\int_0^1 \\frac{1}{\\int_0^1 \\frac{1}{a(\\tilde y)} d\\tilde y} d y = \\frac{1}{2}\\)\nand hence\n\\[\n\\begin{align*}\nu^{(0)} = x \\qquad \\text{and} \\qquad u^{(1)} = - \\frac{1}{ 4 \\pi} \\sin \\left( 2 \\pi y \\right).\n\\end{align*}\n\\]\nThe complete solution reads \\[\n\\begin{align*}\nu(x,y) = u^{(0)} + \\epsilon u^{(1)} = x - \\frac{\\epsilon}{ 4 \\pi} \\sin \\left( 2 \\pi y \\right)\n\\end{align*}\n\\]\nand we indeed see that \\[\n\\begin{align*}\n\\underset{\\epsilon \\to 0}{\\lim} \\, u(x,y) = x,\n\\end{align*}\n\\]\nas we initially postulated!" + "section": "Intermediate Asymptotics", + "text": "Intermediate Asymptotics\nA material is assumed to have an intermediate asymptotics if there are scales \\(X_1\\) and \\(X_2\\), such that an interval \\(\\mathcal I\\) exists, for which:\n\n\\(X_1 \\ll x\\), for \\(x \\in \\mathcal I\\), hence \\(\\tfrac{x}{X_1} \\to \\infty\\)\n\\(x \\ll X_2\\), for \\(x \\in \\mathcal I\\), hence \\(\\tfrac{x}{X_2} \\to 0\\)\n\nThis is formaly referred to as \\(X_1 \\lll X_2\\).\nIntermediate asymptotics exist for materials, in which the characteristic length-scale of the microstructure \\(X_1\\) (often also denoted \\(\\delta\\)) is much smaller than the characteristic length scale of the problem setting \\(X_2\\) (often also denoted by \\(L\\)), hence (\\(\\delta \\lll L\\)).\nIn such a situations, we can safely assume the continuum assumption to apply within all scales that fall into the intermediate interval \\(\\mathcal I\\)." }, { - "objectID": "content/slides/M_porous_media/index.html#homogenized-solution", - "href": "content/slides/M_porous_media/index.html#homogenized-solution", + "objectID": "content/slides/fundamentals/index.html#intermediate-asymptotics-1", + "href": "content/slides/fundamentals/index.html#intermediate-asymptotics-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Homogenized solution", - "text": "Homogenized solution\n\n\n\n\n\nHomogenized solution corresponds to direct solution!\nPostulated \\(\\lim_{\\epsilon \\rightarrow 0} u^\\epsilon (x) = x\\) has been proven!" + "section": "Intermediate Asymptotics", + "text": "Intermediate Asymptotics\nExamples are:\n\nFluids: The ratio of the molecular free path and the characteristic length scale is usually very small. This ratio is also referred to as the Knudsen Number. Systems with a Knudsen Number \\(<0.1\\) can be regarded as continuous.\nPorous media: Porous media can be treated as continuous, when we are interested in a scale that is much larger than the characteristic pore size, e.g. in reservoir engineering. This is different, when we are interested in processes on the pore size level.\n\n\nAn observer of a continuous medium provides\n\na reference system, e.g. an inertial reference system\na clock that allows to measure time\na system of units sufficient for the phenomena that we consider" }, { - "objectID": "content/slides/W_linear_elasticity/wave_equation.html", - "href": "content/slides/W_linear_elasticity/wave_equation.html", - "title": "Linear elasticity", - "section": "", - "text": "\\[\\frac{\\partial^2}{\\partial t^2} \\mathbf w = c \\, \\frac{\\partial^2}{\\partial x^2} \\mathbf w\\]\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\n\n%matplotlib inline\n\n\nNumerical solver based on finite differencing strategy:\n\n\ndef solve_wave_equation(c, L, T, dx, dt, initial_condition):\n \n # check stability\n if c * dt / dx > 1:\n raise ValueError(\"Stability condition violated: c*dt/dx should be <= 1\")\n \n # discretize space-time domain\n x = np.arange(0, L + dx, dx)\n t = np.arange(0, T + dt, dt)\n u = np.zeros((len(t), len(x)))\n \n # set initial condition\n u[0, :] = initial_condition(x)\n if len(t) > 1:\n u[1, :] = u[0, :] \n \n # buffer coefficient \n C2 = (c * dt / dx)**2\n \n # time update\n for n in range(1, len(t) - 1):\n for i in range(1, len(x) - 1):\n u[n + 1, i] = (2 * u[n, i] - u[n - 1, i] + C2 * (u[n, i + 1] - 2 * u[n, i] + u[n, i - 1]))\n \n # set boundary condition\n u[:, 0] = 0\n u[:, -1] = 0\n \n return x, t, u\n\n\nSet up simulation scenario\n\n\n# Initial condition: Gaussian bump\ndef initial_gaussian_pulse(x, sigma=0.1, mu=0.5):\n return np.exp(-((x - mu) / sigma)**2)\n\n# Scenario parameters\nsigma = 0.25 # IC dev\nmu = 0.5 # IC center\nc = 1.0 # Wave speed\nT = 2.0 # Total time\nL = 1.0 # Domain size\ndx = 0.01 \ndt = 0.005\n\n\nDeploy scenario 1 and 2\n\n\n# Run simulation\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 1: Space-time plot at wave speed 1\n\n\n\n\n\n\n# Run simulation\nc = 0.5\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 2: Space-time plot at wave speed 0.5\n\n\n\n\n\n\nAnimate result\n\n\n%%capture\n# Run simulation\nc = 1.0\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagation.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 3: Wave animation of wave with speed 1\n\n\n\n\n\n# Run simulation\nc1 = 1.0\nc2 = 0.5\nx, t, u1 = solve_wave_equation(c1, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\nx, t, u2 = solve_wave_equation(c2, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\n# fig, ax = plt.subplots(figsize=(10,8))\nplt.imshow(u1+u2, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 4: Space-time plot for two superposed waves\n\n\n\n\n\n\n%%capture\n\nu_superposed = 0.5*(u1 + u2)\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'b-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationSuperposed.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 5: Wave animation at superposed waves with wave speed \\((1, 0.5)\\)\n\n\n\n\n\n%%capture\n\n\ndef animate_wave(x, u, u_superposed, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-', label='single wave')\n line2, = ax.plot(x, u_superposed[0, :], 'b-', label='superposed wave')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n plt.legend()\n\n def update(frame):\n line.set_ydata(u[frame, :])\n line2.set_ydata(u_superposed[frame, :])\n return line, line2\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationBoth.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 6: Wave animation of single and superposed wave" + "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space", + "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Repetition: What is a vector space?", + "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V,\\)\nwhich fullfill the following properties for each \\(\\mathbf{u},\\mathbf{v},\\mathbf{w} \\in V\\) and \\(a,b \\in F\\):\n\n(V1) Associativity of vector addition: \\((\\mathbf{u}+\\mathbf{v})+\\mathbf{w} = \\mathbf{u}+(\\mathbf{v}+\\mathbf{w})\\)\n(V2) Commutativity of vector addition: \\(\\mathbf{u}+\\mathbf{v} = \\mathbf{v}+\\mathbf{u}\\)\n(V3) Identity / neutral element of vector addition \\(\\mathbf{0}\\): \\(\\mathbf{u}+\\mathbf{0} = \\mathbf{0}+\\mathbf{u} = \\mathbf{u}\\)\n(V4) Inverse element of vector addition (zero vector) \\(-\\mathbf{u}\\): \\(\\mathbf{u}+(-\\mathbf{u}) = (-\\mathbf{u})+\\mathbf{u} = \\mathbf{0}\\)" }, { - "objectID": "content/slides/W_linear_elasticity/wave_equation.html#d-wave-equation", - "href": "content/slides/W_linear_elasticity/wave_equation.html#d-wave-equation", - "title": "Linear elasticity", - "section": "", - "text": "\\[\\frac{\\partial^2}{\\partial t^2} \\mathbf w = c \\, \\frac{\\partial^2}{\\partial x^2} \\mathbf w\\]\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\n\n%matplotlib inline\n\n\nNumerical solver based on finite differencing strategy:\n\n\ndef solve_wave_equation(c, L, T, dx, dt, initial_condition):\n \n # check stability\n if c * dt / dx > 1:\n raise ValueError(\"Stability condition violated: c*dt/dx should be <= 1\")\n \n # discretize space-time domain\n x = np.arange(0, L + dx, dx)\n t = np.arange(0, T + dt, dt)\n u = np.zeros((len(t), len(x)))\n \n # set initial condition\n u[0, :] = initial_condition(x)\n if len(t) > 1:\n u[1, :] = u[0, :] \n \n # buffer coefficient \n C2 = (c * dt / dx)**2\n \n # time update\n for n in range(1, len(t) - 1):\n for i in range(1, len(x) - 1):\n u[n + 1, i] = (2 * u[n, i] - u[n - 1, i] + C2 * (u[n, i + 1] - 2 * u[n, i] + u[n, i - 1]))\n \n # set boundary condition\n u[:, 0] = 0\n u[:, -1] = 0\n \n return x, t, u\n\n\nSet up simulation scenario\n\n\n# Initial condition: Gaussian bump\ndef initial_gaussian_pulse(x, sigma=0.1, mu=0.5):\n return np.exp(-((x - mu) / sigma)**2)\n\n# Scenario parameters\nsigma = 0.25 # IC dev\nmu = 0.5 # IC center\nc = 1.0 # Wave speed\nT = 2.0 # Total time\nL = 1.0 # Domain size\ndx = 0.01 \ndt = 0.005\n\n\nDeploy scenario 1 and 2\n\n\n# Run simulation\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 1: Space-time plot at wave speed 1\n\n\n\n\n\n\n# Run simulation\nc = 0.5\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\nplt.imshow(u, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 2: Space-time plot at wave speed 0.5\n\n\n\n\n\n\nAnimate result\n\n\n%%capture\n# Run simulation\nc = 1.0\nx, t, u = solve_wave_equation(c, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagation.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 3: Wave animation of wave with speed 1\n\n\n\n\n\n# Run simulation\nc1 = 1.0\nc2 = 0.5\nx, t, u1 = solve_wave_equation(c1, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\nx, t, u2 = solve_wave_equation(c2, L, T, dx, dt, lambda x: initial_gaussian_pulse(x, sigma, mu))\n\n# Visualize result\nplt.figure(figsize = (10,8))\n# fig, ax = plt.subplots(figsize=(10,8))\nplt.imshow(u1+u2, extent=(0, L, 0, T), aspect='auto', origin='lower')\nplt.colorbar(label='Wave amplitude')\nplt.ylabel('Time')\nplt.xlabel('Position')\nplt.title('Wave Propagation')\nplt.show()\n\n\n\n\n\n\n\nFigure 4: Space-time plot for two superposed waves\n\n\n\n\n\n\n%%capture\n\nu_superposed = 0.5*(u1 + u2)\n\ndef animate_wave(x, u, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'b-')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n\n def update(frame):\n line.set_ydata(u[frame, :])\n return line,\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationSuperposed.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 5: Wave animation at superposed waves with wave speed \\((1, 0.5)\\)\n\n\n\n\n\n%%capture\n\n\ndef animate_wave(x, u, u_superposed, interval=50):\n fig, ax = plt.subplots()\n line, = ax.plot(x, u[0, :], 'k-', label='single wave')\n line2, = ax.plot(x, u_superposed[0, :], 'b-', label='superposed wave')\n ax.set_xlim(x.min(), x.max())\n ax.set_ylim(-1.1, 1.1)\n ax.set_xlabel('Position')\n ax.set_ylabel('Wave amplitude')\n ax.set_title('1D Wave Propagation')\n plt.legend()\n\n def update(frame):\n line.set_ydata(u[frame, :])\n line2.set_ydata(u_superposed[frame, :])\n return line, line2\n\n ani = FuncAnimation(fig, update, frames=len(u), interval=interval, blit=True)\n #plt.close(fig)\n return ani\n\nani = animate_wave(x, u, u_superposed)\n\n\nHTML(ani.to_html5_video())\n# ani.save('./WavePropagationBoth.mp4', writer='ffmpeg', dpi=300)\n\n\n\n\n \n Your browser does not support the video tag.\n\n\n\nFigure 6: Wave animation of single and superposed wave" + "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-1", + "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-1", + "title": "Continuum Mechanical Modeling for Simulation Science", + "section": "Repetition: What is a vector space?", + "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V,\\)\nwhich fullfill the following properties for each \\(\\mathbf{u},\\mathbf{v},\\mathbf{w} \\in V\\) and \\(a,b \\in F\\):\n\n(V5) Compatibility of vector addition and scalar multiplication: \\(a \\cdot (\\underbrace{b \\cdot \\mathbf{u}}_{\\text{scalar multiplication}}) = \\underbrace{(a b)}_{\\text{in }F} \\cdot \\mathbf{u}\\)\n(V6) Identity element of scalar multiplication \\(1\\): \\(1 \\cdot \\mathbf{u} = \\mathbf{u} \\cdot 1 =\\mathbf{u}\\)\n(V7) Distributivity of scalar multiplication w.r.t. vector addition: \\(a \\cdot (\\mathbf{u}+\\mathbf{v}) = a \\cdot \\mathbf{u} + a \\cdot \\mathbf{v}\\)\n(V8) Distributivity of scalar multiplication w.r.t. addition in \\(F\\): \\((a+b) \\cdot \\mathbf{u} = a \\cdot \\mathbf{u} + b \\cdot \\mathbf{u}\\)" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#gradient", - "href": "content/slides/derivatives-and-trajectories/index.html#gradient", + "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-2", + "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-2", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Gradient", - "text": "Gradient\nThe gradient of a scalar field \\(\\phi: \\mathbb R^3 \\rightarrow \\mathbb R\\) is a vector field given by\n\\[ \\nabla \\phi (\\mathbf x) = \\frac{\\partial \\phi}{\\partial x_i} (\\mathbf x) \\mathbf e_i\\]\nThe gradient of a vector field \\(\\mathbf v: \\mathbb R^3 \\rightarrow \\mathbb R^3\\) is a second order tensor field given by\n\\[ \\nabla \\mathbf v (\\mathbf x) = \\frac{\\partial v_i}{\\partial x_j} (\\mathbf x) \\mathbf e_i \\otimes \\mathbf e_j\\]" + "section": "Repetition: What is a vector space?", + "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V.\\)\n\nDirect consequences of the above properties are the following:\n(VC1) Multiplication with field zero implies zero vector: \\(0 \\cdot \\mathbf u = \\mathbf 0\\)\n(VC2) Multiplication with zero vector has no effect: \\(a \\cdot \\mathbf 0 = \\mathbf 0\\)\n(VC3) Multiplication with field negative 1 implies inverse element of vector addition: \\((-1) \\cdot \\mathbf u = - \\mathbf u\\)\n(VC4) Zero product property is inherited by the scalar multiplication: \\(a \\cdot \\mathbf u = 0 \\; \\Rightarrow \\; a=0 \\; \\text{and/or} \\; \\mathbf u = \\mathbf 0\\)" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#divergence-and-laplacian", - "href": "content/slides/derivatives-and-trajectories/index.html#divergence-and-laplacian", + "objectID": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-3", + "href": "content/slides/fundamentals/index.html#repetition-what-is-a-vector-space-3", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Divergence and Laplacian", - "text": "Divergence and Laplacian\nThe divergence of a vector field \\(\\mathbf v: \\mathbb R^3 \\rightarrow \\mathbb R^3\\) is a scalar field given by\n\\[ \\nabla \\cdot \\mathbf v = tr( \\nabla \\mathbf v) \\qquad (\\nabla \\cdot \\mathbf v) (\\mathbf x) = \\frac{\\partial v_i}{\\partial x_i} (\\mathbf x) \\]\n\nThe Laplacians of a scalar field \\(\\phi: \\mathbb R^3 \\rightarrow \\mathbb R\\) and a vector field \\(\\mathbf v: \\mathbb R^3 \\rightarrow \\mathbb R^3\\) are defined as\n\\[ \\triangle \\phi = \\nabla \\cdot ( \\nabla \\phi) \\qquad \\triangle \\mathbf v = \\nabla \\cdot ( \\nabla \\mathbf v)\\]" + "section": "Repetition: What is a vector space?", + "text": "Repetition: What is a vector space?\nA vector space \\(V\\) over a field \\(F\\) exhibits a binary interior operation called\nvector addition: \\(\\mathbf{+}: V \\times V \\rightarrow V\\)\nand an operation called\nscalar multiplication: \\(\\mathbf{\\cdot}: F \\times V \\rightarrow V.\\)\n\nCommon examples are\n\nReal vector space for which \\(F=\\mathbb R\\),\n\nComplex vector space for which \\(F=\\mathbb C\\)\nReal vector space for which \\(F=\\mathbb R^3\\)\n\n\nRemark:\nUnless otherwise stated, we will refer to \\(F=\\mathbb R^3\\) if we talk about the vector space. It is important to keep in mind, however, that this is just one example of a vector space!" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#eulerian-versus-lagrangian-reference", - "href": "content/slides/derivatives-and-trajectories/index.html#eulerian-versus-lagrangian-reference", + "objectID": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space", + "href": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Eulerian versus Lagrangian reference", - "text": "Eulerian versus Lagrangian reference\nThe aforementioned form of the state variables is called the Eulerian formulation.\nIn contrast to this, we can look at a material particle initially located at \\(\\mathbf x_0\\) and track its trajectory during motion:\n\\[\n\\mathcal{\\mathbf X} (\\mathbf x_0;t), \\quad \\mathcal{\\mathbf X}:\\mathbb R^+ \\rightarrow \\mathbb R^3,\\quad \\text{with} \\quad \\mathcal{\\mathbf X} (\\mathbf x_0;t) = \\left(X_1(\\mathbf x_0;t),X_2(\\mathbf x_0;t),X_3(\\mathbf x_0;t) \\right)\n\\]\nHere, \\(\\mathbf x_0\\) denotes that the trajectory starts at \\(\\mathbf x_0\\) at time zero. It is, hence, no real space coordinate and can rather be seen as a parameter of \\(\\mathcal{\\mathbf X}\\).\nWe will therefore drop \\(\\mathbf x_0\\) for the rest of this section and refer to the trajectory as\n\\[\n\\mathcal{\\mathbf X} (t) = (X_1(t),X_2(t),X_3(t)).\n\\]" + "section": "How can we navigate in a vector space?", + "text": "How can we navigate in a vector space?\nLet’s consider vectors \\(\\mathbf v_i \\in V\\) and scalars \\(\\alpha_i \\in F\\) for \\(i=1,...,n\\).\n\n\n\\(\\mathbf w = \\sum_{i=1}^{n} \\alpha_i \\mathbf v_i\\) is called a linear combination, hence a weighted superposition of a finite number of elements of \\(V\\).\n\n\n\n\nThe vectors \\(\\mathbf v_i\\) are called linearly independent if \\(\\sum_{i=1}^{n} \\alpha_i \\mathbf v_i=0\\) implies \\(\\alpha_i = 0\\) for all \\(i=1,...,n\\) (see LA textbook for equivalent definitions!)\n\n\n\n\nA subset \\(U \\subset V\\) is called a linear subset if it is closed under vector addition, hence \\(\\mathbf u + \\mathbf v \\in U\\) for all \\(\\mathbf u, \\mathbf v \\in U\\).\n\n\n\n\nA linear span, denoted by \\(span(\\{\\mathbf v_i \\})\\), is the smallest linear subspace that contain \\(\\{\\mathbf v_i \\}\\), hence all its linear combinations!" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-1", - "href": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-1", + "objectID": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space-1", + "href": "content/slides/fundamentals/index.html#how-can-we-navigate-in-a-vector-space-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Local, convective and material derivative", - "text": "Local, convective and material derivative\nTracking the evolution of the density along the trajectory of a fluid parcel, hence \\(\\rho(\\mathcal{\\mathbf X}(t),t)\\), or shorter \\(\\rho(\\mathcal{\\mathbf X},t)\\), is referred to as the density in Lagrangian formulation:\n\nLet’s look at the total density \\(\\rho(\\mathcal{\\mathbf X},t)\\) change along the trajectory:\n\\[\n\\begin{aligned}\n\\frac{d}{dt} \\rho(\\mathcal{\\mathbf X},t) &= \\frac{d}{dt} \\rho(X_1(t),X_2(t),X_3(t),t) \\\\[1em]\n& = \\underbrace{\\frac{d}{dt} X_1(t)}_{=v_1(\\mathbf x,t)} \\cdot \\partial_x \\rho\n+\\underbrace{\\frac{d}{dt} X_2(t)}_{=v_2(\\mathbf x,t)} \\cdot \\partial_y \\rho\n+\\underbrace{\\frac{d}{dt} X_3(t)}_{=v_3(\\mathbf x,t)} \\cdot \\partial_z \\rho\n+\\underbrace{\\frac{d}{dt} t}_{=1} \\cdot \\partial_t \\rho &\\\\[1em]\n& = \\partial_t \\rho + v_1 \\cdot \\partial_{x_1} \\rho + v_2 \\cdot \\partial_{x_2} \\rho + v_3 \\cdot \\partial_{x_3} \\rho\n= \\underbrace{\\underbrace{\\partial_t \\rho}_{\\text{local/time derivative}} + \\underbrace{ \\mathbf v \\cdot \\nabla \\rho }_{\\text{convective derivative}}}_{\\text{material/total derivative denoted by } \\frac{D}{Dt}}\n\\end{aligned}\n\\]" + "section": "How can we navigate in a vector space?", + "text": "How can we navigate in a vector space?\nA set of vectors \\(\\{\\mathbf b_i\\} \\subset V\\) is called a basis if they are linearly independent and form a span of \\(V\\).\n\nEach vector space has at least one basis.\nThe number of basis vectors denotes the dimension of \\(V\\).\nThere are finite dimensional and infinite dimensional vector spaces.\n\n\nImportant consequence:\nFor each element \\(\\mathbf v \\in V\\), we have\n\\[ \\mathbf v = \\sum_{i=1}^n \\alpha_i \\mathbf b_i \\]\nwith \\(n=dim(V)\\) and coordinates/coefficients \\(\\alpha_i\\) unique for a specific set of basis vectors.\nEamples: Eucledian vector space \\(\\mathbb R^3\\) has dimension 3." }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-2", - "href": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-2", + "objectID": "content/slides/fundamentals/index.html#vectors-in-euclidean-space-mathbb-r3", + "href": "content/slides/fundamentals/index.html#vectors-in-euclidean-space-mathbb-r3", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Local, convective and material derivative", - "text": "Local, convective and material derivative\nThe resulting relation between the total derivative and its local and convective counterparts reads:\n\\[\n\\begin{equation*}\n\\frac{D}{Dt} \\rho = \\partial_t \\rho + \\mathbf v \\cdot \\nabla \\rho\n\\end{equation*}\n\\]\n\nFor a vector field \\(\\mathbf v\\), we can do the same, which yields \\[\n\\frac{D}{Dt} \\mathbf v = \\partial_t \\mathbf v + \\mathbf v \\cdot \\nabla \\mathbf v\n\\]\nWritten componentwise this results in three equations \\[\n\\begin{aligned}\n\\frac{D}{Dt} u &= \\partial_t u + \\mathbf v \\cdot \\nabla u \\\\\n\\frac{D}{Dt} v &= \\partial_t v + \\mathbf v \\cdot \\nabla v \\\\\n\\frac{D}{Dt} w &= \\partial_t w + \\mathbf v \\cdot \\nabla w\n\\end{aligned}\n\\]" + "section": "Vectors in Euclidean space \\(\\mathbb R^3\\)", + "text": "Vectors in Euclidean space \\(\\mathbb R^3\\)\nUnless otherwise stated, the vector space in this course will be \\(\\mathbb R^3\\), such that we can think of the vector to be represented by an element of \\(\\mathbb R^3\\) that has a unique coordinate representation.\nThis implies a magnitude and a direction, hence\n\\[ \\mathbf v = (v_1,v_2,v_3)^T = \\underbrace{|\\mathbf v|}_{\\text{magnitude}} \\quad \\underbrace{\\mathbf e_v}_{\\text{direction}}\\]\nWe always have \\(|\\mathbf v| \\geq 0\\). A vector with \\(\\mathbf v\\) with \\(|\\mathbf v|=1\\) is called a unit vector. Two vectors are the same if they coincide in magnitude and direction.\n\nRecall your background knowledge on vectors: In going forward, you should be familiar with scalar product and vector product." }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-3", - "href": "content/slides/derivatives-and-trajectories/index.html#local-convective-and-material-derivative-3", + "objectID": "content/slides/fundamentals/index.html#vectors---important-conclusion", + "href": "content/slides/fundamentals/index.html#vectors---important-conclusion", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Local, convective and material derivative", - "text": "Local, convective and material derivative\nFor an arbitrary field \\(\\phi\\), we have to distinguish\n\\[\n\\underbrace{\\frac{D}{Dt} \\phi = 0}_{\\phi \\text{ constant}} \\qquad \\text{or} \\qquad \\underbrace{\\partial_t \\phi = 0}_{\\phi \\text{ stationary}}\n\\]" + "section": "Vectors - important conclusion", + "text": "Vectors - important conclusion\nFor a basis \\(\\{\\mathbf e_1, \\mathbf e_2, \\mathbf e_3 \\}\\) in \\(\\mathbb R^3\\), we get can write any vector uniquely in its components:\n\\[ \\mathbf v = v_1 \\mathbf e_1 + v_2 \\mathbf e_2 + v_3 \\mathbf e_3 \\quad \\left( = v_i \\mathbf e_i \\right)\\]\nwith \\([\\mathbf v] = (v_1,v_2,v_3)^T\\) being the coordinates of vector \\(\\mathbf v\\)." }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#pathlines-or-trajectory", - "href": "content/slides/derivatives-and-trajectories/index.html#pathlines-or-trajectory", + "objectID": "content/slides/fundamentals/index.html#second-order-tensors", + "href": "content/slides/fundamentals/index.html#second-order-tensors", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Pathlines or trajectory", - "text": "Pathlines or trajectory\nThe actual physical motion of a fluid particle is describes by its trajectory or pathline defined as \\(\\mathcal{\\mathbf X} (t) = (X_1(t),X_2(t),X_3(t))\\). This corresponds to the Lagrangian formulation of the motion described before. A pathline is what you would see on a photo with a long exposure time when recording a moving object.\n\nPathline" + "section": "Second order tensors", + "text": "Second order tensors\nPhysical quantities, such as stress and strain cannot be represented as vectors, but rather by linear transformations between vectors.\nA second order tensor on the vector space \\(V\\) is hence a mapping \\(\\mathbf T : V \\rightarrow V\\), which is linear for all \\(\\mathbf u, \\mathbf v \\in V\\) and \\(\\alpha \\in F\\), hence\n\\[ \\mathbf T(\\mathbf u + \\mathbf v) = \\mathbf T(\\mathbf u) + \\mathbf T(\\mathbf v) \\quad \\mathbf T( \\alpha \\mathbf u) = \\alpha \\mathbf T(\\mathbf u)\\]" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#pathlines", - "href": "content/slides/derivatives-and-trajectories/index.html#pathlines", + "objectID": "content/slides/fundamentals/index.html#second-order-tensors-1", + "href": "content/slides/fundamentals/index.html#second-order-tensors-1", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Pathlines", - "text": "Pathlines\nGiven an initial position \\(\\mathbf{x}_0\\) at time \\(t=0\\), the pathline or trajectory \\(\\mathbf{X}(\\mathbf{x}_0; t)\\) can be determined from the following ordinary differential equation:\n\\[\n\\begin{eqnarray*}\n\\frac{d}{dt} \\mathbf{X}(t) &=& \\mathbf{v}(\\mathbf{X}(t),t) \\\\\n\\mathbf{X}(0) &=& \\mathbf{x}_0,\n\\end{eqnarray*}\n\\]\nin which \\(\\mathbf{x}_0\\) constitutes a parameter that denotes the dependence of the pathline or trajectory on the particle’s initial position." + "section": "Second order tensors", + "text": "Second order tensors\nFor a basis \\(\\{\\mathbf e_1, \\mathbf e_2, \\mathbf e_3 \\}\\), we get can write any second order tensor in its components according to\n\\[ [S] = S_{ij} = \\mathbf e_i \\cdot \\mathbf S \\mathbf e_j\\]\nThe coordinates can hence be represented as a matrix \\(S_{ij}\\).\nThe space of second order tensors is itself a vector space of basis \\(\\{\\mathbf e_i \\otimes \\mathbf e_j\\}\\), in which the dyadic product is defined as\n\\[(\\mathbf u \\otimes \\mathbf v) \\mathbf a = (\\mathbf a \\cdot \\mathbf v)\\mathbf u\\]\nfor all \\(\\mathbf a \\in \\mathcal V\\). We then get\n\\[ [S + T] = [S] + [T] \\qquad [\\alpha S] = \\alpha [T]\\]" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#streamline", - "href": "content/slides/derivatives-and-trajectories/index.html#streamline", + "objectID": "content/slides/fundamentals/index.html#second-order-tensors-2", + "href": "content/slides/fundamentals/index.html#second-order-tensors-2", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Streamline", - "text": "Streamline\nThe streamline describes a curves, whose tangent vector constitutes the velocity at that location. An analogy would be iron filings in the vacinity of a bar magnet that orient themselves along the magnetic field lines.\n\nStreamline" + "section": "Second order tensors", + "text": "Second order tensors\nRecall your background knowledge on the properties of second order tensors and their matrix representation: In going forward, you should be familiar with\n\ntransposition of a matrix / tensor\nsymmetry of a matrix / tensor\nskewsymmetry of a matrix / tensor\n\nYou should know what is meant and how to test a matrix / tensor to be\n\npositive definite\ninvertible\northogonal." }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#streamline-1", - "href": "content/slides/derivatives-and-trajectories/index.html#streamline-1", + "objectID": "content/slides/fundamentals/index.html#second-order-tensors-3", + "href": "content/slides/fundamentals/index.html#second-order-tensors-3", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Streamline", - "text": "Streamline\nPer its definition, the streamline \\(\\frac{d}{ds} \\mathbf{\\hat{X}}(s)\\) has to be tangent to the velocity field \\(\\mathbf{v}\\) at every point in space for a given time. It is defined as\n\\[\n\\begin{eqnarray}\n\\frac{d}{ds} \\mathbf{\\hat X}(s) = \\alpha \\mathbf{v}( \\mathbf{\\hat X}(s),t^*).\n\\end{eqnarray}\n\\]\nwith \\(\\alpha \\in \\mathbb R \\setminus \\{0\\}\\).\nThis definition automatically fullfills the required condition: \\[\n\\begin{aligned}\n\\frac{d}{ds} \\mathbf{\\hat X}(s) \\times \\frac{d}{ds} \\mathbf{\\hat X}(s) & = \\alpha \\mathbf{v}(\\mathbf{\\hat X}(s),t^*) \\times \\frac{d}{ds} \\mathbf{\\hat X}(s) = 0.\n\\end{aligned}\n\\]" + "section": "Second order tensors", + "text": "Second order tensors\nA second order tensor can always be decomposed into a symmetric and a skewsymmetric part \\[ \\mathbf S = \\mathbf E + \\mathbf W\\]\nin which \\[ \\mathbf E = \\frac{1}{2} (\\mathbf S + \\mathbf S^T) \\qquad \\mathbf W = \\frac{1}{2} (\\mathbf S - \\mathbf S^T)\\]\nAs mappings, \\(\\mathbf E\\) and \\(\\mathbf W\\) are referred to as \\(sym(\\mathbf S)\\) and \\(skew(\\mathbf S)\\)." }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#streakline", - "href": "content/slides/derivatives-and-trajectories/index.html#streakline", + "objectID": "content/slides/fundamentals/index.html#second-order-tensors-4", + "href": "content/slides/fundamentals/index.html#second-order-tensors-4", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Streakline", - "text": "Streakline\nA streakline, finally describes the set of all points that have passed through a particular point \\(\\mathbf{x}_0\\) in the past. A typical example is given by a visualization in response to a continuously released tracer, such as ink in a water flow, or smoke in a wind tunnel.\n\nStreakline" + "section": "Second order tensors", + "text": "Second order tensors\nA skew symmetric tensor can furthermore always be expressed as a vector product, in the sense that there exist a \\(\\mathbf w\\), such that\n\\[\\mathbf W \\mathbf v = \\mathbf w \\times \\mathbf v\\]\n\\(\\mathbf w\\) is also denoted by \\(vec(\\mathbf W)\\) and referred to as the axial vector.\n\nRecall your background knowledge on the properties of second order tensors and their matrix representation:\n\ninvariants of a matrix / tensor, such as trace and determinant\neigensystem of a matrix / tensor including eigenvalue and eigenvector" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#streakline-1", - "href": "content/slides/derivatives-and-trajectories/index.html#streakline-1", + "objectID": "content/slides/fundamentals/index.html#continuous-field", + "href": "content/slides/fundamentals/index.html#continuous-field", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Streakline", - "text": "Streakline\nAssuming a location \\(\\mathbf{x}_0\\) to be given, the streakline \\(\\mathbf{\\widetilde{X}}(\\mathbf{x}_0, \\tau_0; \\tau)\\) is defined as\n\\[\n\\begin{eqnarray}\n\\frac{d}{d\\tau} \\mathbf{\\widetilde{X}(\\tau)} &=& \\mathbf{v}(\\mathbf{\\widetilde{X}(\\tau)}, \\tau_0 + \\tau) \\\\\n\\widetilde{\\mathbf{X}}(0) &=& \\mathbf{x}_0\n\\end{eqnarray}\n\\]\nNote, that the start time (of the injection) \\(\\tau_0\\) might varies for each particle." + "section": "Continuous field", + "text": "Continuous field\nUnder the continuum assumption, we can assume that we can describe the state of the system in terms of continuous fields. The fields are functions of position \\(\\mathbf x = (x,y,z)^T\\) and time \\(t\\).\nRelevant to this lecture will be: \\[\n\\begin{aligned}\n&\\rho(\\mathbf x,t) : \\text{density field (mass per unit volume)}\\\\\n&\\mathbf v (\\mathbf x,t) = (v_1(\\mathbf x,t),v_2(\\mathbf x,t),v_2(\\mathbf x,t))^T : \\text{velocity field}\\\\\n&p(\\mathbf x,t) : \\text{pressure field}\\\\\n&T(\\mathbf x,t) : \\text{temperature field }\\\\\n&\\mathbf \\sigma(\\mathbf x,t) : \\text{stress field}\\\\\n\\end{aligned}\n\\]\n\n\n\n\n\nRemark\n\n\nField relates to the fact that the variable is defined on some region \\(\\Omega\\). We discriminate\n\nscalar fields, e.g. density \\(\\rho:\\Omega \\times \\mathbb R^+ \\rightarrow \\mathbb R^+\\)\nvector fields, e.g. velocity \\(\\mathbf v:\\Omega \\times \\mathbb R^+ \\rightarrow \\mathbb R^d\\)\ntensor fields, e.g. stress tensor \\(\\mathbf \\sigma:\\Omega \\times \\mathbb R^+ \\rightarrow \\mathbb R^{d \\times d}\\)" }, { - "objectID": "content/slides/derivatives-and-trajectories/index.html#interactive-plot", - "href": "content/slides/derivatives-and-trajectories/index.html#interactive-plot", + "objectID": "content/slides/fundamentals/index.html#element-in-a-vector-space-in-index-notation", + "href": "content/slides/fundamentals/index.html#element-in-a-vector-space-in-index-notation", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Interactive plot", - "text": "Interactive plot" + "section": "Element in a vector space in index notation", + "text": "Element in a vector space in index notation\nAs an element of a vector space, a vector can always be written in its basis:\n\\[\n\\mathbf{v} \\left( \\mathbf{x},t \\right) = u \\left( \\mathbf{x},t \\right) \\mathbf{e}_x + v \\left( \\mathbf{x},t \\right)\\mathbf{e}_y + w \\left( \\mathbf{x},t \\right) \\mathbf{e}_z\n\\]\nAlternatively, basis and vector components can be numbered, which yields\n\\[\n\\mathbf{v} = v_1 e_1 + v_2 e_2 + v_3 e_3 = \\sum_{i=1}^3 v_i e_i\n\\]\nIf an index appears twice in a term, summation is assumed, such that\n\\[\n\\mathbf{v} = \\sum_{i=1}^3 v_i e_i = v_i e_i \\quad \\text{and} \\quad \\mathbf{v} \\cdot \\mathbf{w} = v_i w_i\n\\]" }, { - "objectID": "content/slides/introduction/index.html#goal-of-the-lecture", - "href": "content/slides/introduction/index.html#goal-of-the-lecture", + "objectID": "content/slides/fundamentals/index.html#references", + "href": "content/slides/fundamentals/index.html#references", "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Goal of the lecture", - "text": "Goal of the lecture\nThis lecture provides an introduction to\ncontinuum mechanical modeling from the perspective of simulation science and computational engineering.\nStarting from fundamentals and balance laws, we consider\nimportant classes of mathematical models\nfor transport, flow and multiphysics processes. We also discuss\ncomplexity reduction strategies\nsuch as homogenization and depth-averaging to enable the simulation of porous media flow, free-surface flow and solid-liquid phase change processes.\nComplementary theoretical and programming exercises\nhelp to consolidate the content of this lecture and provide theoretical and application-oriented examples." + "section": "References", + "text": "References\n\n\n\n\nGonzalez, Oscar, and Andrew M. Stuart. 2001. A First Course in Continuum Mechanics. 1st ed. Cambridge University Press. https://www.cambridge.org/core/product/identifier/9780511619571/type/book." }, { - "objectID": "content/slides/introduction/index.html#lecture", - "href": "content/slides/introduction/index.html#lecture", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lecture", - "text": "Lecture\nTarget audience:\n\nSimulation Sciences\nComputational Engineering Sciences\nComputer Science\n…\n\n\nRequired preliminary knowledge:\n\nCalculus and linear algebra\nBasic knowledge of numerical methods for partial differential equations, e.g. acquired through NumPDE\nBasic knowledge in fluidmechanics and thermodynamics is an advantage, but no must." + "objectID": "content/resources/index-student.html", + "href": "content/resources/index-student.html", + "title": "Resources", + "section": "", + "text": "Date\n\n\nTitle\n\n\nAuthor\n\n\n\n\n\n\n\nNo matching items" }, { - "objectID": "content/slides/introduction/index.html#lecture-1", - "href": "content/slides/introduction/index.html#lecture-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Lecture", - "text": "Lecture\nTime slots:\n\n🕣 Monday, 8:30 - 10:00, 📍 Eilfschornsteinstr. 18, Room 009\n🕣 Friday, 8:30 - 10:00, 📍 Eilfschornsteinstr. 18, Room 009\n\nSchedule is displayed on https://mbd.pages.rwth-aachen.de/courses/cmm/\n\n\n\n\n\n\n\nNote\n\n\nAny short notice changes will be communicated via moodle!" + "objectID": "content/exercises/intro.html", + "href": "content/exercises/intro.html", + "title": "My first FenicsX program", + "section": "", + "text": "This notebook gives a small introduction to FenicsX, an open-source FEM library. We use the Python API of FenicsX to solve an example PDE problem.", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#exercises", - "href": "content/slides/introduction/index.html#exercises", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Exercises", - "text": "Exercises\nTime slots:\n\n🕣 Friday, 14:30 - 16:00, 📍 Eilfschornsteinstr. 18, Room 009\n\n\n\n\n\n\n\n\n\n\nFigure 1: Ingo Steldermann (steldermann@…)\n\n\n\n\n\n\n\n\n\n\nFigure 2: Benjamin Terschanski (terschanski@…)\n\n\n\n\n\n\n\n\n\n\nFigure 3: Alan Correa (correa@…)\n\n\n\n\n\nWeekly exercises will start this week\nStructure and assignment-based bonus point system will be introduced in the first exercise" + "objectID": "content/exercises/intro.html#learning-goals", + "href": "content/exercises/intro.html#learning-goals", + "title": "My first FenicsX program", + "section": "Learning goals", + "text": "Learning goals\n\nUnderstand the basic structure of a FenicsX program\nLearn the basic building blocks of modern FEM software: mesh, function space, boundary conditions, weak form, and solvers", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#further-organization", - "href": "content/slides/introduction/index.html#further-organization", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Further organization", - "text": "Further organization\nExams\n\n🕣 05.08.2025, 09:00 – 11:00, 📍 (FT (2090|120) Melatener Str. 23-25, 1.Obergeschoß)\nBonus points via homeworks -> details will be provided during exercises\nOld exams can be found on our webpage -> note evolution of exam structure\n\n\nMaterial and resources:\n\nAnnouncements are sent out and archived via moodle!\nScript, slides and exercises will be made available via our lecture webpage:\n\nhttps://mbd.pages.rwth-aachen.de/courses/cmm/" + "objectID": "content/exercises/intro.html#poisson-model", + "href": "content/exercises/intro.html#poisson-model", + "title": "My first FenicsX program", + "section": "Poisson model", + "text": "Poisson model\nIn this example, we solve the classical Poisson equation for a scalar \\(u\\),\n\\[\n-\\Delta u = f \\text{ in } \\Omega = \\left[0, \\,1\\right] \\times \\left[0,\\,1\\right], \\quad u = g \\text{ on } \\partial\\Omega \\quad ,\n\\]\nwhere \\(\\Omega\\) is the domain of interest, \\(f\\) is a given scalar source term, and \\(g\\) is a Dirichlet boundary condition.", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology", - "href": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Simulation sciences are a key enabling technology", - "text": "Simulation sciences are a key enabling technology\nObjectives inherent to many societal challenges require fundamental understanding of the underlying physical processes, systems thinking, and advanced compute methods!\n\n\n\nFigure 4: Addressing societal challenges requires proficiency in simulation science and computational science and engineering" + "objectID": "content/exercises/intro.html#structure", + "href": "content/exercises/intro.html#structure", + "title": "My first FenicsX program", + "section": "Structure", + "text": "Structure\nBelow, we learn how to\n\ncreate a mesh for a simple domain\npick discrete FEM function spaces (which functions do we use to approximate the PDE solution?)\ndefine the weak form of the PDE\napply boundary conditions\nassemble and solve the linear system resulting from the discretization\nvisualize the solution", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology-1", - "href": "content/slides/introduction/index.html#simulation-sciences-are-a-key-enabling-technology-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Simulation sciences are a key enabling technology", - "text": "Simulation sciences are a key enabling technology\nObjectives inherent to many societal challenges require fundamental understanding of the underlying physical processes, systems thinking, and advanced compute methods!\n\n\n\nFigure 5: Addressing societal challenges requires proficiency in simulation science and computational science and engineering" + "objectID": "content/exercises/intro.html#lets-go", + "href": "content/exercises/intro.html#lets-go", + "title": "My first FenicsX program", + "section": "Let’s go!", + "text": "Let’s go!\nFirst, we import some of the necessary python libraries\n\nfrom mpi4py import MPI\nimport numpy as np\nimport tqdm.autonotebook\n\ntry:\n import os\n\n username = os.getenv(\"USER\") or os.geteuid()\n\n # Set XDG_RUNTIME_DIR to a valid directory\n os.environ[\"XDG_RUNTIME_DIR\"] = f\"/tmp/runtime-{username}\"\n os.makedirs(os.environ[\"XDG_RUNTIME_DIR\"], exist_ok=True)\n os.chmod(os.environ[\"XDG_RUNTIME_DIR\"], 0o700)\nexcept Exception as e:\n print(f\"Failed to set XDG_RUNTIME_DIR: {e}\")\n print(\"You might get some warnings, but it should still work.\")\n\n/tmp/ipykernel_3316/138077527.py:3: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n import tqdm.autonotebook", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#modeling-solid-liquid-phase-change-the-stefan-problem", - "href": "content/slides/introduction/index.html#modeling-solid-liquid-phase-change-the-stefan-problem", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Modeling solid-liquid phase-change: The Stefan problem", - "text": "Modeling solid-liquid phase-change: The Stefan problem\n\n\nFigure 6: Milestone contribution to the modeling of phase-change processes due to Stefan, 1891" + "objectID": "content/exercises/intro.html#mesh-and-computational-domain", + "href": "content/exercises/intro.html#mesh-and-computational-domain", + "title": "My first FenicsX program", + "section": "Mesh and computational domain", + "text": "Mesh and computational domain\nThe basis for our discretization is a discrete approximation \\(\\Omega_h\\) of the computational domain.\nHere, he have the choice between different discretization types, e.g. quadrilateral, triangular etc.\n\nfrom dolfinx import mesh\n\nnumber_elements = 5\ndomain = mesh.create_unit_square(\n MPI.COMM_WORLD, number_elements, 1, cell_type=mesh.CellType.quadrilateral\n)", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes", - "href": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Stefan’s solution cannot capture all processes", - "text": "Stefan’s solution cannot capture all processes\n\n\n\nFigure 7: Measuring phase-change processes" + "objectID": "content/exercises/intro.html#the-variational-problem", + "href": "content/exercises/intro.html#the-variational-problem", + "title": "My first FenicsX program", + "section": "The variational problem", + "text": "The variational problem\nA key step in building finite element methods is the weak form of the PDE, upon which the discrete variational problem is based.\nIn all cases, the weak form is obtained by multiplying the PDE with a test function \\(v\\) and integrating over the domain \\(\\Omega\\).\nFurther operations on the resulting integral equations, such as integration by parts, can then be applied. This is often done improve the properties of the method, for example to - reduce the required regularity (we need less derivatives of the solution to exist) and hence allow for lower-order (=cheaper) finite element spaces - introduce symmetry to the (bi-)linear forms, which is favored by many linear solvers - introduce certain natural boundary conditions, e.g. the terms that appear as boundary integrals in the weak form\nA first key realization is that the weak form for a given PDE is not unique.", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-1", - "href": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Stefan’s solution cannot capture all processes", - "text": "Stefan’s solution cannot capture all processes\n\n\nFigure 8: Measuring phase-change processes" + "objectID": "content/exercises/intro.html#a-weak-form-for-the-poisson-equation", + "href": "content/exercises/intro.html#a-weak-form-for-the-poisson-equation", + "title": "My first FenicsX program", + "section": "A weak form for the Poisson equation", + "text": "A weak form for the Poisson equation\nA typical variational problem for the Poisson equation is given by\nFind \\(u \\in V\\) such that \\[\n\\int_\\Omega \\nabla u_h \\cdot \\nabla v_h \\, dx - \\cancel{\\int_{\\partial\\Omega} \\mathbf{\\nabla} u_h \\cdot \\mathbf{n} \\, v_h \\, ds} = \\int_\\Omega f v_h \\, dx\n\\] for all \\(v \\in V_{0}\\). Here \\(\\mathbf{n}\\) is the outward normal vector on the boundary \\(\\partial\\Omega\\) and \\(V_{0}\\) is the space of functions that vanish on the boundary, hence the boundary integral vanishes.\nThe discrete variational problem is obtained by replacing the continous domain \\(\\Omega\\) with its discrete approximation \\(\\Omega_h\\) (our mesh) and the continuous trial and test spaces \\(V\\) and \\(V_{0}\\) with the discrete finite element spaces \\(V_h\\) and \\(V_{h,0}\\), respectively.\nTechnical note: By default, FenicsX test functions are zero on parts of the boundary where Dirichlet conditions are applied. Since we only use Dirichlet condiitons in this example, we don’t have to worry about the boundary integral term and we omit the \\(V_{h,0}\\) notation.", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-2", - "href": "content/slides/introduction/index.html#stefans-solution-cannot-capture-all-processes-2", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Stefan’s solution cannot capture all processes", - "text": "Stefan’s solution cannot capture all processes\nWe need to develop physics-based continuum mechanical computational models at a problem specific fidelity.\n\n\nFigure 9: Measuring phase-change processes" + "objectID": "content/exercises/intro.html#our-first-finite-element", + "href": "content/exercises/intro.html#our-first-finite-element", + "title": "My first FenicsX program", + "section": "Our first finite element", + "text": "Our first finite element\nThe term “finite element” refers to the basis functions defined on our mesh. The idea of the finite element method is to find the best approximation of the solution \\(u\\) in a finite-dimensional function space \\(V_h\\).\nWe thus have to pick a finite element function space \\(V_h\\) on our mesh.\nTypically, the choice of the function space is crucial for the accuracy and convergence of the method (lego block analogy)\nLet’s start with a simple linear polynomial function space on the quadrilateral mesh that we created (check out what it looks like here)\n\n# used for plotting\nfrom dolfinx.fem import functionspace, Function, Constant, form\nfrom basix.ufl import element\n\n\nmesh_element_name = domain.topology.cell_name() \n\"\"\" type of mesh element, e.g. \"quadrilateral\" \"\"\"\nbasis_functions_degree = 1\n\"\"\" degree of the finite basis functions \"\"\"\n\nfinite_element = element(\n family=\"CG\", cell=domain.topology.cell_name(), degree=basis_functions_degree\n)\ndiscrete_fem_space = functionspace(mesh=domain, element=finite_element)\n\nLets have a look at our beautiful mesh:\n\ntry:\n shell = get_ipython().__class__.__name__\n has_visualization = True \nexcept NameError:\n has_visualization = False\n\nif has_visualization:\n import pyvista\n import dolfinx\n\n # Set the default window size globally\n pyvista.global_theme.window_size = (600, 600) # Adjust width and height as needed\n\n pyvista.set_jupyter_backend(\"static\")\n pyvista.start_xvfb()\n\n # Extract topology from mesh and create pyvista mesh\n topology, cell_types, x = dolfinx.plot.vtk_mesh(discrete_fem_space)\n grid = pyvista.UnstructuredGrid(topology, cell_types, x)\n\n plotter = pyvista.Plotter()\n plotter.add_title(f\"Mesh with {number_elements} elements\")\n plotter.add_mesh(grid, show_edges=True)\n plotter.camera_position = \"xy\"\n\n if not pyvista.OFF_SCREEN:\n plotter.show()\n else:\n plotter.screenshot(\"mesh.png\")", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] + }, + { + "objectID": "content/exercises/intro.html#from-math-to-code-the-weak-form-and-ufl", + "href": "content/exercises/intro.html#from-math-to-code-the-weak-form-and-ufl", + "title": "My first FenicsX program", + "section": "From Math to Code: the weak form and UFL", + "text": "From Math to Code: the weak form and UFL\nThe main advantage of software like FenicsX is that it provides a way to work in a syntax that is very close to the mathematical notation of the weak form. The underlying syntax is called UFL (Unified Form Language) and is a domain-specific language for finite element variational forms.\nLet’s see how we can write the weak form in UFL.\n\nfrom ufl import TestFunction, TrialFunction, dot, ds, dx, grad\n\nV_h = discrete_fem_space\n\"\"\" Discrete finite element space \"\"\"\n\nu_h = TrialFunction(V_h)\n\"\"\" discrete trial function \"\"\"\nv_h = TestFunction(V_h)\n\"\"\" discrete test function \"\"\"\n\nf = Constant(domain, 0.0)\n\"\"\" right-hand side source term \"\"\"\n\n# Define the weak form lhs == rhs\nweak_form_lhs = dot(grad(u_h), grad(v_h)) * dx\nweak_form_rhs = f * v_h * dx", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#what-is-a-model", - "href": "content/slides/introduction/index.html#what-is-a-model", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "What is a model?", - "text": "What is a model?\nA model is a purposeful idealization and abstraction of our perception of reality.\n\n\n\n\n\n\n\n\n\n\nFigure 10: Idealization reduces complexity and facilitates feasibility.\n\n\n\n\n\n\n\n\n\n\nFigure 11: Abstraction reduces a complex system to its essential parts and facilitates transfer." + "objectID": "content/exercises/intro.html#boundary-conditions", + "href": "content/exercises/intro.html#boundary-conditions", + "title": "My first FenicsX program", + "section": "Boundary conditions", + "text": "Boundary conditions\nThere are a couple of ways to apply boundary conditions in FenicsX. We cover the simplest way to set Dirichlet boundary conditions.\nThe basic idea is to tell FenicsX where we want to apply the Dirichlet boundary condition in terms of the mesh and then let the software figure out which nodes and facets of the mesh coincide with that geometrical location.\nWe therefore start by defining functions to tell FenicsX what we consider to be the left and right boundary of the domain (\\(x=0\\) and \\(x=1\\)).\n\n# return 1 on the left boundary of the unit square, e.g when x = (x,y)[0] close to 0\ndef left_boundary_marker(x):\n return np.isclose(x[0], 0.0)\n\n\n# return 1 on the right boundary of the unit square, e.g when x = (x,y)[0] close to 1\ndef right_boundary_marker(x):\n return np.isclose(x[0], 1.0)\n\nWe now create two boundary conditions for a constant value of \\(g=1\\) on the left boundary and \\(g=0\\) on the right boundary.\n\nfrom dolfinx.fem import dirichletbc, locate_dofs_topological\nfrom dolfinx.mesh import locate_entities_boundary\n\nmesh_topology_dim = domain.topology.dim\nfacet_geometrical_dimension = mesh_topology_dim - 1\n\nfacets_on_left_boundary = locate_entities_boundary(\n domain, facet_geometrical_dimension, left_boundary_marker\n)\ndofs_on_left_boundary = locate_dofs_topological(\n V_h, facet_geometrical_dimension, facets_on_left_boundary\n)\n\nvalue_left = Constant(domain, 1.0)\n\"\"\" value on the left boundary \"\"\"\nbc_left = dirichletbc(value_left, dofs_on_left_boundary, V_h)\n\nfacets_on_right_boundary = locate_entities_boundary(\n domain, facet_geometrical_dimension, right_boundary_marker\n)\ndofs_on_right_boundary = locate_dofs_topological(\n V_h, facet_geometrical_dimension, facets_on_right_boundary\n)\nvalue_right = Constant(domain, 0.0)\n\"\"\" value on the right boundary \"\"\"\nbc_right = dirichletbc(value_right, dofs_on_right_boundary, V_h)\n\ndirichlet_boundary_conditions = [bc_left, bc_right]\n\"\"\" list of Dirichlet boundary conditions \"\"\"\n\n' list of Dirichlet boundary conditions '", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#what-is-a-model-1", - "href": "content/slides/introduction/index.html#what-is-a-model-1", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "What is a model?", - "text": "What is a model?\nIn simulation science and computational engineering, the purpose often implies an I/O character.\n\n\n\n\n\n\n\nFigure 12: Relevant models often have an I/O character" + "objectID": "content/exercises/intro.html#assemble-and-solve-the-linear-system", + "href": "content/exercises/intro.html#assemble-and-solve-the-linear-system", + "title": "My first FenicsX program", + "section": "Assemble and solve the linear system", + "text": "Assemble and solve the linear system\nWe start by creating a discrete function to store our solution vector. The function lives in the same approximation space as our trial function \\(u_h\\) and is initialized to zero:\n\ndiscrete_solution = Function(V_h)\n\"\"\" discrete solution, a function in the finite element space. Our solution vector will be stored here \"\"\"\n\n' discrete solution, a function in the finite element space. Our solution vector will be stored here '\n\n\nThen, we create a writer for the VTK file to store our results on disk.\n\nfrom pathlib import Path\nfrom dolfinx.io import VTXWriter\n\nfrom pathlib import Path\n\nout_folder_path = Path(\"out_tutorial\")\nout_folder_path.mkdir(exist_ok=True, parents=True)\nvtx_writer = VTXWriter(\n domain.comm, out_folder_path / \"poisson_solution.bp\", discrete_solution, engine=\"BP4\"\n)\nvtx_writer.write(t=0.0)\n\nvtk_file_abs_path_name = str(out_folder_path.resolve()) + \"/poisson_solution.bp\"\nprint(\"Writing solution to file \" + vtk_file_abs_path_name)\n\nWriting solution to file /root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#computational-model-development-cycle", - "href": "content/slides/introduction/index.html#computational-model-development-cycle", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Computational model development cycle", - "text": "Computational model development cycle\n\n\n\n\n\n\nFigure 13: Verification and Validation in CE" + "objectID": "content/exercises/intro.html#this-is-where-the-magic-happens", + "href": "content/exercises/intro.html#this-is-where-the-magic-happens", + "title": "My first FenicsX program", + "section": "This is where the magic happens", + "text": "This is where the magic happens\nWe now reap the true benefit of modern FEM backends: we can assemble the linear system and solve it in a single line of code.\n\nfrom dolfinx.fem.petsc import LinearProblem\n\nlinear_solver_options = {\"ksp_type\": \"preonly\", \"pc_type\": \"lu\"}\n\nproblem = LinearProblem(\n weak_form_lhs,\n weak_form_rhs,\n bcs=dirichlet_boundary_conditions,\n petsc_options= linear_solver_options,\n)\n\n\ndiscrete_solution = problem.solve()\n\n# Write the solution to disk\nvtx_writer.write(t=1.0)\n\nOk… something happened … I guess? Let’s see if we can visualize the solution.", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#content-overview", - "href": "content/slides/introduction/index.html#content-overview", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "Content overview", - "text": "Content overview\n\nOverview of the lecture" + "objectID": "content/exercises/intro.html#visualization", + "href": "content/exercises/intro.html#visualization", + "title": "My first FenicsX program", + "section": "Visualization", + "text": "Visualization\nThere are different ways to visualize the solution. For a check of the solution from within our python script, we can visualize the solution using pyvista.\nThe result is not super pretty but we can check that the solution indeed “looks” like a linear connection between the boundary conditions\n\nif has_visualization:\n cells, types, x = dolfinx.plot.vtk_mesh(V_h)\n grid = pyvista.UnstructuredGrid(cells, types, x)\n plotter = pyvista.Plotter()\n\n plotter.add_mesh(grid, scalars=discrete_solution.x.array, show_edges=True, cmap=\"coolwarm\")\n plotter.add_title(f\"solution\")\n\n # add axes labels for x and y axes\n plotter.show_bounds(\n grid=None,\n location=\"outer\",\n all_edges=True,\n )\n\n plotter.view_xy()\n plotter.show()", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/slides/introduction/index.html#references", - "href": "content/slides/introduction/index.html#references", - "title": "Continuum Mechanical Modeling for Simulation Science", - "section": "References", - "text": "References\n\nGonzalez and Stuart (2001)\n\n\n\n\n\nGonzalez, Oscar, and Andrew M. Stuart. 2001. A First Course in Continuum Mechanics. 1st ed. Cambridge University Press. https://www.cambridge.org/core/product/identifier/9780511619571/type/book." + "objectID": "content/exercises/intro.html#post-processing-with-paraview", + "href": "content/exercises/intro.html#post-processing-with-paraview", + "title": "My first FenicsX program", + "section": "Post-processing with Paraview", + "text": "Post-processing with Paraview\nWe can also visualize the solution using Paraview. To do that, we open the files written to the following location\n\nprint(vtk_file_abs_path_name)\n\n/root/shared/content/notebooks/intro_to_fenics/out_tutorial/poisson_solution.bp", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "content/exam/index-student.html", - "href": "content/exam/index-student.html", - "title": "Old exams", - "section": "", - "text": "Order By\n Default\n \n Title\n \n \n Date - Oldest\n \n \n Date - Newest\n \n \n \n \n \n \n \n\n\n\n\n\nDate\n\n\nTitle\n\n\n\n\n\n\n2023 01 01\n\n\nExam Problem WS 23\n\n\n\n\n2023 08 01\n\n\nExam Problem SS 23\n\n\n\n\n2024 08 14\n\n\nExam Problem SS 24\n\n\n\n\n2025 03 18\n\n\nExam Problem WS 24\n\n\n\n\n\nNo matching items" + "objectID": "content/exercises/intro.html#verification-comparing-with-the-exact-solution", + "href": "content/exercises/intro.html#verification-comparing-with-the-exact-solution", + "title": "My first FenicsX program", + "section": "Verification: Comparing with the exact solution", + "text": "Verification: Comparing with the exact solution\nFor the simple 1D Poisson equation, we can easily compare with the analytical solution, which is just a linear connection of the boundary values, e.g.\n\\[\nu_{\\text{exact}}(x,y) = 1 - x \\quad \\text{ for } x \\in [0,1], y \\in [0,1]\n\\]\n\nfrom dolfinx.fem import assemble_scalar, form\nfrom petsc4py import PETSc\n\ndef u_exact(x):\n values = np.zeros((1 , x.shape[1]), dtype=PETSc.ScalarType)\n values[0] = 1.0 - x[0]\n return values\n\nu_ex = Function(V_h)\nu_ex.interpolate(u_exact)\n\nL2_error = form(dot(discrete_solution - u_ex, discrete_solution - u_ex) * dx)\n\nerror_L2 = np.sqrt(domain.comm.allreduce(assemble_scalar(L2_error), op=MPI.SUM))\nerror_max = domain.comm.allreduce(\n np.max(discrete_solution.x.petsc_vec.array - u_ex.x.petsc_vec.array), op=MPI.MAX\n)\n\nprint(\"L2 error with respect to the analytical solution: \" + str(error_L2))\nprint(\"Maximum error at the degrees of freedom: \" + str(error_max))\n\nL2 error with respect to the analytical solution: 1.2378947445213391e-16\nMaximum error at the degrees of freedom: 3.3306690738754696e-16", + "crumbs": [ + "Exercises", + "My first FenicsX program" + ] }, { - "objectID": "public-lecturer/content/exercises/exercise01.html", - "href": "public-lecturer/content/exercises/exercise01.html", - "title": "Index notation", + "objectID": "public-lecturer/content/exercises/homework01.html", + "href": "public-lecturer/content/exercises/homework01.html", + "title": "Einstein Summation, Vector Algebra", "section": "", - "text": "In a right-handed, orthonormal system of fixed basis vectors \\(\\mathbf{e}_1\\), \\(\\mathbf{e}_2\\) and \\(\\mathbf{e}_3\\) of unit length, an arbitrary vector \\(\\mathbf{u}\\) has the following co-ordinate (component) expression\n\\[\n\\mathbf{u} = u_1 \\mathbf{e}_1 + u_2 \\mathbf{e}_2 + u_3 \\mathbf{e}_3 = \\sum_{i=1}^{3} u_i \\mathbf{e}_i = \\begin{pmatrix} u_1 \\\\ u_2 \\\\ u_3 \\end{pmatrix}\n\\]\nBy dropping the summation symbol, we get the vector \\(\\mathbf{u}\\) in Einstein summation convention as follows \\[\n\\mathbf{u} = u_i \\mathbf{e}_i\n\\] where a summation is implied in an expression, whenever indices occur twice. The repeated indices are called free or dummy indices. In order to evaluate and simplify expressions in vector and tensor algebra we make use of\n\\[\n\\delta_{ij} = \\begin{cases}\n 1,& \\text{if } i=j\\\\\n 0,& \\text{if } i\\not=j\n\\end{cases}\n\\]\nFor the dot product of two orthonormal basis vectors we have \\[\n\\mathbf{e}_i \\cdot \\mathbf{e}_j = \\delta_{ij}\n\\]\nWe often require you to change the notation from one form to another.\nExample:" + "text": "****Submission Deadline: 30.04.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "public-lecturer/content/exercises/exercise01.html#tasks", - "href": "public-lecturer/content/exercises/exercise01.html#tasks", - "title": "Index notation", + "objectID": "public-lecturer/content/exercises/homework01.html#tasks", + "href": "public-lecturer/content/exercises/homework01.html#tasks", + "title": "Einstein Summation, Vector Algebra", "section": "Tasks", - "text": "Tasks\n\nShow that the scalar projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\n\nWrite out the dot-product of two arbitrary vectors \\(\\mathbf{u} \\cdot \\mathbf{v}\\) in component notation and index notation.\n\n\n\nWrite the cross-product of two arbitrary vectors \\(\\mathbf{u} \\times \\mathbf{v}\\) in component notation and in index notation.\n\n\n\nWrite the expression \\(\\left(\\mathbf{u} \\cdot \\nabla \\right) \\mathbf{u}\\) in component notation and in index notation.\n\n\n\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product\n\n\\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\nTip\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]" + "text": "Tasks\n\nTask 1\nShow that the projection of a vector \\(\\mathbf{u}\\) on any of the basis vectors, \\(\\text{proj}_{\\mathbf{e}_{i}}(\\mathbf{u}) := \\mathbf{u} \\cdot \\mathbf{e}_{i}\\), is identical to the component of \\(\\mathbf{u}\\) corresponding to that basis vector.\n\n\nTask 2\nCalculate the dot-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\) in index notation\n\n\nTask 3\nUsing index notation, calculate the cross-product of two arbitrary vectors \\(\\mathbf{u}\\) and \\(\\mathbf{v}\\)\n\n\nTask 4\nShow that, for three arbitrary vectors \\(\\mathbf{u}\\), \\(\\mathbf{v}\\) and \\(\\mathbf{w}\\) the triple vector product \\[\n\\mathbf{u} \\times (\\mathbf{v} \\times \\mathbf{w}) = \\mathbf{v} (\\mathbf{u} \\cdot \\mathbf{w}) - \\mathbf{w} (\\mathbf{u} \\cdot \\mathbf{v})\n\\]\n\nTip\nBetween the Kronecker delta and the Levi-Civita symbol, the following identity holds\n\\[\n\\epsilon_{ijk} \\,\\epsilon_{klm} = \\delta_{il} \\,\\delta_{jm} - \\delta_{im} \\, \\delta_{jl}\n\\]" }, { - "objectID": "public-lecturer/content/exercises/homework02.html", - "href": "public-lecturer/content/exercises/homework02.html", - "title": "Velocity Decomposition", - "section": "", - "text": "****Submission Deadline: 14.05.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "objectID": "public-lecturer/content/exercises/homework01.html#tasks-1", + "href": "public-lecturer/content/exercises/homework01.html#tasks-1", + "title": "Einstein Summation, Vector Algebra", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nShow that the components of the tensor in the orthonormal basis {\\(\\mathbf{e}_1\\), \\(\\mathbf{e}_3\\), \\(\\mathbf{e}_2\\)} can be calculated as follows \\[\nA_{ij} = \\mathbf{e}_i \\cdot \\mathbf{A} \\mathbf{e}_j\n\\]\n\n\nTask 2\nUsing index notation, show that \\(\\mathbf{v} \\cdot \\mathbf{A}^{T}\\mathbf{u} = \\mathbf{u} \\cdot \\mathbf{A} \\mathbf{v}\\)." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks", - "href": "public-lecturer/content/exercises/homework02.html#tasks", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework01.html#tasks-2", + "href": "public-lecturer/content/exercises/homework01.html#tasks-2", + "title": "Einstein Summation, Vector Algebra", "section": "Tasks", - "text": "Tasks\n\nTask 1\nDecompose the given velocity fields and calculate for each field: \\(\\mathbf{w}\\) and \\(\\mathbf{D}\\)\n\n\nTask 2\nDescribe the motion produced by each velocity field.\n\n\nTask 3\nSketch each flow field within a domain given by \\(x,y \\in [-4, 4]\\times [-4, 4]\\)\n\n\nTask 4\nWithin the flow field, sketch how a volume element having vertices \\((1, 1), (1, 2), (2, 2), (2,1)\\) deforms." + "text": "Tasks\n\nTask 1\nUsing a cartesian co-ordinate system, show that \\[\n\\nabla \\times (\\nabla u) = \\mathbf{0}\n\\]\n\n\nTask 2\nUsing a cylindrical co-ordinate system, show that \\[\n\\nabla \\cdot (\\nabla \\times \\mathbf{v}) = 0\n\\]\n\n\nTask 3\nCalculate in a spherical co-ordinate system the value of \\(\\Delta u\\)\n\n\nTask 4\nGiven another scalar field \\(\\alpha\\), using cartesian co-ordinates, show that\n\\[\n\\nabla \\cdot (\\alpha \\mathbf{v}) = \\alpha \\nabla \\cdot \\mathbf{v} + \\mathbf{v} \\cdot \\nabla \\alpha\n\\]" }, { - "objectID": "public-lecturer/content/exercises/homework02.html#setup", - "href": "public-lecturer/content/exercises/homework02.html#setup", - "title": "Velocity Decomposition", - "section": "Setup", - "text": "Setup\nFor the visualization, we shall use the python libraries numpy and matplotlib. Here, we first import the libraries\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\n\nLet us define a grid of points within the domain \\(x, y \\in [-5, 5] \\times [-5, 5]\\)\n\nx, y = np.meshgrid(np.linspace(-5,5,21),np.linspace(-5,5,21))" + "objectID": "public-lecturer/content/exercises/homework01.html#tasks-3", + "href": "public-lecturer/content/exercises/homework01.html#tasks-3", + "title": "Einstein Summation, Vector Algebra", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nUsing the mass balance law, calculate the value of \\[\n\\dfrac{1}{\\rho} \\dfrac{D(\\rho)}{Dt}\n\\]\n\n\nTask 2\nIn the Eulerian formulation, write down the momentum balance law in component notation.\n\nTip\nIn the Lagrangian formulation, the component notation of the momentum balance law is given as \\[\nx: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{xx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{xy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{xz}}{\\partial z}\\right) + b_x\n\\] \\[\ny: \\dfrac{Dv_{y}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{yx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{yy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{yz}}{\\partial z}\\right) + b_y\n\\] \\[\nz: \\dfrac{Dv_{x}}{Dt} = \\dfrac{1}{\\rho} \\left(\\dfrac{\\partial {\\sigma}_{zx}}{\\partial x} + \\dfrac{\\partial {\\sigma}_{zy}}{\\partial y} + \\dfrac{\\partial {\\sigma}_{zz}}{\\partial z}\\right) + b_z\n\\]\n\n\n\nTask 3\nIn the Eulerian formulation, write down the mass and momentum balance laws in index notation" }, { - "objectID": "public-lecturer/content/exercises/homework02.html#task1---velocity-field", - "href": "public-lecturer/content/exercises/homework02.html#task1---velocity-field", - "title": "Velocity Decomposition", - "section": "Task1 - Velocity Field", - "text": "Task1 - Velocity Field\n\nComputation\nImplement the computation for the components of the velocity vector at every point \\((x, y)\\) on the grid using numpy math functions.\n\n\nVisualization\nWe can now visualize the velocity field using a quiver plot\n\nplt.quiver(x,y,v_x, v_y)\nplt.gca().set_aspect('equal')\nplt.xlabel(\"x\")\nplt.ylabel(\"y\")\nplt.title(\"Velocity field\");\nplt.xticks([-5, 0, 5]);\nplt.yticks([-5, 0, 5]);" + "objectID": "public-lecturer/content/exercises/homework01.html#tasks-4", + "href": "public-lecturer/content/exercises/homework01.html#tasks-4", + "title": "Einstein Summation, Vector Algebra", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nSketch two trajectories for \\(t \\in (0, 2 \\pi)\\) as well as their respective field values \\(\\phi(\\mathbf X(t), t)\\) over time.\n\n\nTask 2\nDescribe \\(\\phi(\\mathbf X(t), t)\\) in the Eulerian frame.\n\n\nTask 3\nConsider another field given by \\(\\psi(\\mathbf X(t), t) = X^2 + Y^2\\). Rewrite \\(\\psi\\) in the Eulerian frame.\n\n\nTask 4\nCompute \\(\\frac{d\\phi}{dt}\\) and \\(\\frac{D\\phi}{dt}\\) using their definitions." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#task-2---velocity-gradient", - "href": "public-lecturer/content/exercises/homework02.html#task-2---velocity-gradient", - "title": "Velocity Decomposition", - "section": "Task 2 - Velocity Gradient", - "text": "Task 2 - Velocity Gradient\nThe velocity gradient \\(\\nabla \\mathbf{v}\\) is a second order tensor, and hence cannot be visualized on a 2D plot. Here, we shall look at the individual components of the velocity gradient tensor.\n\nComputation\nCalculate the components of the velocity gradient tensor and implement the computation in the following\n\n\nVisualization\nWe can now visualize the components of the velocity gradient individually.\n\nfigure, axs = plt.subplots(nrows=2, ncols=2, figsize=(9, 7))\nmin_val = np.min([np.min(dvx_dx), np.min(dvx_dy), np.min(dvy_dx), np.min(dvy_dy)])\nmax_val = np.max([np.max(dvx_dx), np.max(dvx_dy), np.max(dvy_dx), np.max(dvy_dy)])\naxs[0, 0].imshow(dvx_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 0].quiver(x,y,v_x, v_y)\naxs[0, 0].set_xticks([-5, 0, 5])\naxs[0, 0].set_yticks([-5, 0, 5])\naxs[0, 0].set_xlabel(\"x\")\naxs[0, 0].set_ylabel(\"y\")\naxs[0, 0].set_title(r'$\\partial_x v_x$')\n\naxs[0, 1].imshow(dvx_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[0, 1].quiver(x,y,v_x, v_y)\naxs[0, 1].set_xticks([-5, 0, 5])\naxs[0, 1].set_yticks([-5, 0, 5])\naxs[0, 1].set_xlabel(\"x\")\naxs[0, 1].set_ylabel(\"y\")\naxs[0, 1].set_title(r'$\\partial_y v_x$')\n\naxs[1, 0].imshow(dvy_dx, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 0].quiver(x,y,v_x, v_y)\naxs[1, 0].set_xticks([-5, 0, 5])\naxs[1, 0].set_yticks([-5, 0, 5])\naxs[1, 0].set_xlabel(\"x\")\naxs[1, 0].set_ylabel(\"y\")\naxs[1, 0].set_title(r'$\\partial_x v_y$')\n\nim = axs[1, 1].imshow(dvy_dy, extent=(-5.5, 5.5, -5.5, 5.5), vmin=min_val, vmax=max_val, cmap='coolwarm', interpolation='spline16')\naxs[1, 1].quiver(x,y,v_x, v_y)\naxs[1, 1].set_xticks([-5, 0, 5])\naxs[1, 1].set_yticks([-5, 0, 5])\naxs[1, 1].set_xlabel(\"x\");\naxs[1, 1].set_ylabel(\"y\");\naxs[1, 1].set_title(r'$\\partial_y v_y$');\n\nfigure.subplots_adjust(right=0.8)\ncax,kw = mpl.colorbar.make_axes([ax for ax in axs.flat])\nplt.colorbar(im, cax=cax, **kw)\nplt.show()" + "objectID": "public-lecturer/content/exercises/homework01.html#tasks-5", + "href": "public-lecturer/content/exercises/homework01.html#tasks-5", + "title": "Einstein Summation, Vector Algebra", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nCompute the pathlines.\n\n\nTask 2\nCompute the streamlines.\n\n\nTask 3\nCompute the streaklines.\n\n\nTask 4\nSketch the velocity field for\n\n\\(t_0 < \\frac{k x}{\\alpha}\\)\n\\(t_1 = \\frac{k x}{\\alpha}\\)\n\\(t_2 > \\frac{k x}{\\alpha}\\)\n\nand furthermore add\n\nthe pathline for one particular \\(\\mathbf x_0\\)\none particular streamline in each figure\nthe streakline starting at \\(t_0\\) for one particular \\(\\mathbf x_0\\)." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#task-3---divergence-of-velocity", - "href": "public-lecturer/content/exercises/homework02.html#task-3---divergence-of-velocity", - "title": "Velocity Decomposition", - "section": "Task 3 - Divergence of Velocity", - "text": "Task 3 - Divergence of Velocity\n\nComputation\nCalculate the divergence of the velocity field using already computed quatities, and implement it in the following.\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result" + "objectID": "public-lecturer/content/exercises/homework03.html", + "href": "public-lecturer/content/exercises/homework03.html", + "title": "Hooke’s Law", + "section": "", + "text": "****Submission Deadline: 04.06.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "public-lecturer/content/exercises/homework02.html#task-4---vorticity", - "href": "public-lecturer/content/exercises/homework02.html#task-4---vorticity", - "title": "Velocity Decomposition", - "section": "Task 4 - Vorticity", - "text": "Task 4 - Vorticity\n\nComputation\nCalculate the vorticity (or curl) of the velocity field using previously computed quantities and implement it in the following\n\n\nVisualization\nPlot the divergence of the velocity field and interpret the result." + "objectID": "public-lecturer/content/exercises/homework03.html#tasks", + "href": "public-lecturer/content/exercises/homework03.html#tasks", + "title": "Hooke’s Law", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nUsing Hooke’s law, calculate the stretch in a new 6 m long steel (Young’s Modulus \\(E= 20 \\times 10^{10} \\text{Pa}\\)) pipe that supports a \\(100 \\text{kg}\\) drill bit and a \\(3 \\text{km}\\) long pipe with a linear mass density of \\(20 \\text{kg} \\text{m}^{-1}\\). Treat the pipe as a solid cylinder with a \\(5 \\text{cm}\\) diameter.\n\n\nTask 2\nAssuming a Poisson’s ratio \\(\\nu = \\dfrac{1}{3}\\), what is the corresponding cross-sectional thinning?\n\n\nTask 3\nCalculate the bulk modulus and the Lame constants for the steel pipe.\n\n\nTask 4\nUsing the Voigt notation, calculate the Stiffness Matrix for the case of Linear Elasticity using the Lame’s constants." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks-1", - "href": "public-lecturer/content/exercises/homework02.html#tasks-1", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework03.html#tasks-1", + "href": "public-lecturer/content/exercises/homework03.html#tasks-1", + "title": "Hooke’s Law", "section": "Tasks", - "text": "Tasks\n\nTask 1\nState the Bernoulli equation and explain to what fluid flow scenarios can it be applied.\n\n\nTask 2\nCalculate the velocity of the flowing fluid in terms of the difference in height of the fluid \\(\\Delta h\\) in the U-shaped tube and other given quantities given in the figure.\n\n\nTask 3\nIf the velocity of the inflowing fluid is doubled, how would \\(\\Delta h\\) change?" + "text": "Tasks\n\nTask 1\nDecompose the deformation gradient and identify the dilation, rotation and stretch.\n\n\nTask 2\nDetermine about which co-ordinate axis rotation takes place. By what angle is the sample rotated?" }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks-2", - "href": "public-lecturer/content/exercises/homework02.html#tasks-2", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework03.html#tasks-2", + "href": "public-lecturer/content/exercises/homework03.html#tasks-2", + "title": "Hooke’s Law", "section": "Tasks", - "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" + "text": "Tasks\n\nTask 1\nDraw a sketch of the experiment. Write down the stress and strain tensor for this experiment. Does shear occur in the experiment?\n\n\nTask 2\nUsing the constitutive relation for Isotropic Linear Elasticity, calculate the elastic constants \\(\\lambda\\) and \\(\\mu\\) for this rock sample.\n\n\nTask 3\nCalculate the Young’s Modulus and Poisson’s ratio for rock material.\n\n\nTask 4\nUsing the Voigt Notation, compute the Compliance Matrix for the rock material." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks-3", - "href": "public-lecturer/content/exercises/homework02.html#tasks-3", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework03.html#tasks-3", + "href": "public-lecturer/content/exercises/homework03.html#tasks-3", + "title": "Hooke’s Law", "section": "Tasks", - "text": "Tasks\n\nTask 1\nWe want to derive a non-parametric representation of Mohr’s Circle in 2D.\nThe transformation rule for second order tensors is given as\n\\[\n\\sigma' = \\mathbf{R} \\, \\sigma \\, \\mathbf{R}^T\n\\]\nwhere \\(\\mathbf{R}\\) is the rotation matrix\n\\[\n\\mathbf{R}(\\theta)\n=\n\\begin{pmatrix}\ncos(\\theta) & -sin(\\theta) \\\\\nsin(\\theta) & cos(\\theta) \\\\\n\\end{pmatrix}\n\\].\nProceed as follows:\n\nLet \\(\\sigma_x' = \\sigma_n\\) be the normal stress and \\(\\tau_{xy} = \\tau_{n}\\) be the shear stress. Derive a parametric representation of \\(\\sigma_n\\) and \\(\\tau_n\\) using the transformation rule given above.\nSimplify the expression by using trigonometric rules (Hint: we aim for expressions of \\(2\\theta\\))\nObtain a non-parametric expression of a circle, \\((x-a)^2 + (y-b)^2 = r^2\\).\n\n\n\nTask 2\nCompute for \\(\\mathbf{S}_1\\) using Mohr’s circle:\n\nThe maximum shear stress and the angle \\(\\theta\\)\nThe maximal normal stress and the angle \\(\\theta\\)\nThe minimal normal stress and the angle \\(\\theta\\)\n\n\n\nTask 3\nCompute the principal stresses \\((\\sigma_1, \\sigma_2, \\sigma_3)\\) of \\(\\mathbf{S}_2\\). We can now construct Mohr’s circle in 3d as follows:\n\nDraw a coordinate system \\((\\sigma_n, \\tau_n)\\)\nMark the principal stresses on the abscissa\nDraw three circles, each circle passes through two of the three principal stresses marked on the abscissa.\n\n\n\nTask 4\nCompute for \\(\\mathbf{S}_2\\) using Mohr’s circle:\n\nThe maximum shear stress.\nThe maximal normal stress and the correpsonding directional vector.\nThe minimal normal stress and the corresponding directional vector." + "text": "Tasks\n\nTask 1\nDecide whether each of the material model is objective, and give reasons for the decision.\n\n\nTask 2\nDecide whether each of the material model is isotropic, and give reasons for the decision." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks-4", - "href": "public-lecturer/content/exercises/homework02.html#tasks-4", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework03.html#tasks-4", + "href": "public-lecturer/content/exercises/homework03.html#tasks-4", + "title": "Hooke’s Law", "section": "Tasks", - "text": "Tasks\n\nTask 1\nDerive the weak formulation of the problem assuming that the displacement \\(\\mathbf{u} \\in H^1(\\Omega)\\) and test function \\(\\phi \\in H^1(\\Omega)\\). Make sure to differentiate between the Dirichlet and Neumann boundary term. Why is the implementation of the Dirichlet term in this weak formulation difficult?\n\nNote\nRecall the very common notation that a function space with subscript zero, e.g. \\(\\mathbb{V}_0\\) denotes compact support. For our purposes, this means that the function vanishes at the boundary.\n\n\nNote\nRecall from your PDE class that \\(H^1\\) denotes a Hilbert space.\n\n\nTip\nRecall from your PDE-class that a weak formulation is derived by multiplying your problem with a test function (e.g. denoted as \\(\\phi\\)) and integrated over the domain \\(\\Omega\\). Often, integration by parts is employed to reduce the demands on the funtional space of the solution.\nYour weak formulation always needs to be stated in a way similar to the following:\nFind \\(\\mathbf{u} \\in \\mathbb{V}\\) such that \\[\n \\begin{cases}\n & \\text{YOUR } \\\\\n & \\text{PROBLEM} \\\\\n & \\text{STATEMENT} \\\\\n \\end{cases}\n\\] \\(\\forall \\phi \\in \\mathbb{W}\\)\nWhere \\(\\phi \\in \\mathbb{W}\\) denotes the test function we used to derive the weak form.\n\n\n\nTask 2\nA typical solution strategy to solve the issue with the Dirichlet boundary condition is to ‘lift’ the problem. We will do this step by step\n\nConstruct a (simple) function \\(\\mathbf b(x, y)\\) that fulfills \\(\\mathbf b(0, y) = \\mathbf g_0(y)\\) and \\(\\mathbf b(1, y) = \\mathbf g_1(y)\\).\nDefine a new function \\(\\mathbf w = \\mathbf u - \\mathbf b\\)\nConsider a suitable function space for \\(w\\). What changed compared to the function space of \\(u\\)?\nSubstituve \\(\\mathbf w\\) into the strong formulation of our problem. Do not forget the boundary conditions.\nWrite down the weak formulation for the problem statement derived in 4. Make sure to choose an approriate (and useful) function space for the test function as well.\nAssume you are given the solution \\(\\mathbf w^*\\) for the weak formulation you posed in 5. Write down the solution for \\(\\mathbf u\\)." + "text": "Tasks\n\nTask 1\nThe elastic limit is given for \\(\\alpha > 0\\) and \\(\\beta = 0\\). Show that Equation 1 admits solutions of type Equation 2 which are not dampened in time.\n\n\nTask 2\nThe viscous limit is given for \\(\\alpha = 0\\) and \\(\\beta > 0\\). Show that Equation 1 admits stationary solutions of type Equation 2 which are dampened exponentially in time.\n\n\nTask 3\nHow does the solution look like for the case \\(\\alpha > 0\\) and \\(\\beta > 0\\)? Differentiate the cases\n\n\\(4 \\, \\rho \\alpha > \\beta^2\\)\n\\(4 \\, \\rho \\alpha < \\beta^2\\)" }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks-5", - "href": "public-lecturer/content/exercises/homework02.html#tasks-5", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework03.html#tasks-5", + "href": "public-lecturer/content/exercises/homework03.html#tasks-5", + "title": "Hooke’s Law", "section": "Tasks", - "text": "Tasks\n\nTask 1\nCompute the Cauchy stress tensor \\(\\mathbf{\\sigma} \\in \\mathbb{R}^{3x3}\\) by directly solving the linear system associated with \\(\\mathbf{t}^i = \\mathbf{\\sigma} \\mathbf{n}^i\\) for \\(i=\\{1,2,3\\}\\).\n\nNote\nYou can use your computer to solve the system if you want.\n\n\n\nTask 2\nNow we want to solve for the stress tensor without the need to solve a linear system. You can do so by changing the coordinate system such that\n\\[\n \\mathbf{\\tilde{t}} = \\mathbf{\\tilde{\\sigma}} \\mathbf{n} = \\mathbf{\\tilde{\\sigma}} \\mathbf{e}\n\\]\nwhere \\(\\mathbf{n}\\) is an arbitrary vector of unit length and \\(\\mathbf{e}\\) is a cartesian unit vector. Then the rows of \\(\\mathbf{\\tilde{\\sigma}}\\) are given \\(\\mathbf{\\tilde{t}}\\)." + "text": "Tasks\n\nTask 1\nShow that Equation 3 satisfies Equation 4 if and only the condition\n\\[\nA \\, k^2 \\left( \\mu \\mathbf{n}_d + (\\mu + \\lambda) (\\mathbf{n}_d \\cdot \\mathbf{n}_p)\\mathbf{n}_p \\right) = A\\rho\\omega^2 \\mathbf{n}_d\n\\]\nis met.\n\n\nTask 2\nIn the following, we want to show that for a linear elastic, isotropic solid with \\(\\lambda + \\mu \\neq 0\\), plane waves only admit two types of solutions. The first wave type are longitudinal waves in direction \\(\\mathbf{n}_p\\) where \\(\\mathbf{n}_p \\, \\parallel \\, \\mathbf{n}_d\\). The second wave type are transverse waves where \\(\\mathbf{n}_p \\, \\bot \\, \\mathbf{n}_d\\).\nAssume \\(\\lambda + \\mu \\neq 0\\). For any given \\(\\mathbf{n}_p \\neq \\mathbf{0}\\) and \\(A, k \\neq 0\\) show that the only independent solutions \\((\\mathbf{n}_d, \\omega)\\) are:\n\\[\n\\begin{aligned}\n& \\mathbf{n}_d = \\pm \\mathbf{n}_p, \\quad \\omega^2 = k^2 (\\lambda + 2 \\mu) / \\rho, \\\\\n& \\mathbf{n}_d \\cdot \\mathbf{n}_p = 0, \\quad \\omega^2 = k^2 \\mu / \\rho.\n\\end{aligned}\n\\]\n\nTip\nYou need to identify and solve an eigenvalue problem.\n\n\n\nTask 3\nWhat happens in the case \\(\\lambda + \\mu = 0\\)." }, { - "objectID": "public-lecturer/content/exercises/homework02.html#tasks-6", - "href": "public-lecturer/content/exercises/homework02.html#tasks-6", - "title": "Velocity Decomposition", + "objectID": "public-lecturer/content/exercises/homework03.html#tasks-6", + "href": "public-lecturer/content/exercises/homework03.html#tasks-6", + "title": "Hooke’s Law", "section": "Tasks", - "text": "Tasks\n\nTask 1\nWe are now interessted in gaining a better understanding of the physical meaning of the theorem.\nFor that matter, proceed as follows:\n\nWrite down the Divergence Threorem while explicitly keeping track of the dependence on the spatial coordinate \\(\\mathbf{x} \\in B\\), where \\(B = (\\mathbf{y}, \\delta)\\) indicates a ball with center point \\(y\\) and radius \\(\\delta\\).\nNow we would like to rewrite the divergence term in an expansion around the center point \\(\\mathbf{y}\\) and higher order terms\nSimplify the integral by introducing \\(vol(B)\\).\nIsolate the divergence term and take the limit for \\(\\delta \\rightarrow 0\\).\nInterpret the final relation in your own words.\n\n\n\nTask 2\nGiven \\(\\Omega\\) and \\(\\partial \\Omega\\) as before, we now consider an arbitrary second-order tensor \\(\\mathbf S \\in \\mathbb{R}^{3\\times3}\\). Prove the Tensor Divergence Theorem\n\\[\n\\int_{\\Omega} \\nabla \\cdot \\mathbf S \\: d \\: \\Omega = \\int_{\\partial \\Omega} \\mathbf S \\cdot \\mathbf n \\: d \\: A\n\\qquad(1)\\]\n\nTip\nMultiply (dot product) Equation 1 with an arbitrary (constant) vector. Make use of the Divergence Theorem to proof the Tensor Divergence Theorem." + "text": "Tasks\n\nTask 1\nAssume \\(\\mathbf{u}\\) is smooth and solves Equation 5. Show that \\(\\mathbf{D}\\) must satify the following six compatibility equations:\n\\[\nD_{nj, km} + D_{km, jn} - D_{kn, jm} - D_{mj, kn} = 0\n\\]\n\nNote\nThe subscripts before the comma denote the components. The subscript after the comma denote the derivatives." }, { - "objectID": "public-lecturer/content/exercises/homework04.html", - "href": "public-lecturer/content/exercises/homework04.html", - "title": "Pipe Flow", + "objectID": "public-lecturer/content/exercises/homework05.html", + "href": "public-lecturer/content/exercises/homework05.html", + "title": "Galilean invariance", "section": "", - "text": "****Submission Deadline: 20.06.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "text": "****Submission Deadline: 09.07.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "public-lecturer/content/exercises/homework04.html#tasks", - "href": "public-lecturer/content/exercises/homework04.html#tasks", - "title": "Pipe Flow", + "objectID": "public-lecturer/content/exercises/homework05.html#tasks", + "href": "public-lecturer/content/exercises/homework05.html#tasks", + "title": "Galilean invariance", "section": "Tasks", - "text": "Tasks\n\nTask 1\nHow is the process model called?\n\n\nTask 2\nFor a constant pressure gradient \\(\\frac{\\partial p}{\\partial z} = -P\\), is the pressure greater at \\(z_0\\) or \\(z_1\\)?\n\n\nTask 3\nHow do mass and momentum balance read in cylindrical coordinates?\n\nTip\nGradient and divergence in cylindrical coordinates are given by:\n\n\n\nTask 4\nAssuming constant pressure in the cross-sectional area \\(\\frac{\\partial p}{\\partial {\\theta}} = \\frac{\\partial p}{\\partial r } = 0\\), how do mass and momentum balance reduce? What does this imply for the velocity field?\n\n\nTask 5\nFurthermore, there will be no change in the pipe’s flow field in time and no flow in radial direction or rotational direction. Hence \\(u_z = u_z(r, \\theta)\\) and \\(u_r = u_{\\theta} = 0\\). How does the remaining process model look like?\n\n\nTask 6\nDerive an explicit expression for the velocity profile. Also, derive an expression that yields the volume discharge?\n\n\nTask 7\nAssume that the pressure grdient drops by a factor of \\(50\\%\\). How can you change the setting to assure the same volume discharge?" + "text": "Tasks\n\nTask 1\nShow that the SWE with velocity profile correction are not Galilean invariant.\n\n\nTask 2\nIf we assume plug-flow \\((\\alpha=1)\\), show that the SWE are Galilean invariant." }, { - "objectID": "public-lecturer/content/exercises/homework04.html#tasks-1", - "href": "public-lecturer/content/exercises/homework04.html#tasks-1", - "title": "Pipe Flow", + "objectID": "public-lecturer/content/exercises/homework05.html#tasks-1", + "href": "public-lecturer/content/exercises/homework05.html#tasks-1", + "title": "Galilean invariance", "section": "Tasks", - "text": "Tasks\n\nTask 1\nDraw a sketch of the situation. Indicate all mentioned variables and the coordinate system. Explain why the velocity in both y- and z-direction vanish.\n\n\nTask 2\nDetermine an equation for the velocity profile in the fluid.\n\nTip\nThe volume flowing through a specific cross-section per unit time calculates as Here, with the width \\(L\\), this simplifies to\n\n\n\nTask 3\nDerive an equation for the volume flow rate per unit width.\n\n\nTask 4\nCalculate how much oil does the oil skimmer actually remove per unit time?" + "text": "Tasks\n\nTask 1\nWhat does \\(\\alpha\\) stand for and how can it be computed? Determine \\(\\alpha\\) for a linear velocity profile with \\(u(y=0) = 0\\) and \\(u(y=h) = u_s\\).\n\n\nTask 2\nAssume a shallow lake, currently at rest. That means \\(h=H\\) and \\(u=0\\). A stone is thrown into the lake and causes a small surface perturbation in height and velocity, denoted by \\(h_1\\) and \\(u_1\\). Derive a of equations for \\(h_1\\) and \\(u_1\\) by means of linearization\n\nTip\nThe linearization can be performed by looking at small perturbations from a ground state \\((h_0, u_0)\\), e.g. by defining: \\(h(x,t) = h_0(x, t) + \\delta \\, h_1(x,t) + \\mathcal{O}( \\delta^2 )\\) and \\(u(x,t) = u_0(x, t) + \\delta \\, u_1(x,t) + \\mathcal{O}( \\delta^2 )\\), where \\(\\delta\\) denotes the small amplitude of the perturbation.\n\n\n\nTask 3\nReduce the system derived in Task 2 to an equation for \\(h_1\\). What type of equation do we find?\n\n\nTask 4\nThe wave ansatz is given by \\(h_1(x,t) = A \\, e^{i (k \\, x - \\omega \\, t)}\\). State what \\(A\\), \\(i\\), \\(k\\) and \\(\\omega\\) stand for? Using the wave ansatz, compute the phase velocity.\n\n\nTask 5\nAssume that we wait \\(10s\\) until a surface perturbation caused by a stone reaches the lake’s shore. How much longer would we have to wait at a similarly sized lake on Saturn’s moon Titan? (Titan has surface lakes of liquid ethane and methane and a gravitational acceleration of \\(g=1.4 \\frac{m}{s^2}\\))" }, { - "objectID": "public-lecturer/content/exercises/homework04.html#tasks-2", - "href": "public-lecturer/content/exercises/homework04.html#tasks-2", - "title": "Pipe Flow", + "objectID": "public-lecturer/content/exercises/homework05.html#tasks-2", + "href": "public-lecturer/content/exercises/homework05.html#tasks-2", + "title": "Galilean invariance", "section": "Tasks", - "text": "Tasks\n\nTask 1\nCompute the nondimensional version of Equation 2 using the scales\n\\[\n\\tilde{t} = t / t_0 \\quad \\tilde{x_i} = x_i / L_0 \\quad \\tilde{v_i} = v_i / U_{0} \\quad \\tilde{p} = p / p_0 \\quad.\n\\]\nYour expression should contain the following nondimensional numbers:\n\nStrouhal number \\(Str := \\frac{L_0}{t_0 \\, U_0}\\)\nReynold’s number \\(Re := \\frac{L_0 U_0}{\\nu}\\)\nMach number \\(Ma := \\frac{U_0}{a_0}\\)\n\nwhere \\(a_0\\) is the speed of sound in water. \\(a_0\\) is related to the other variables as \\(a_0^2 = \\frac{p_0}{\\rho_0}\\).\n\n\nTask 2\nAssume a steady flow with a small Mach number \\(Ma \\ll 1\\).\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\nNote\n\\(\\mathcal{o}(Ma^2)\\) indicates that all other terms are arbitrarily small compared to \\(Ma^2\\).\n\n\n\nTask 3\nAssume a steady flow with a small velocity \\(U_0 \\ll 1\\). Assume that all other quantities remain constant.\nGiven the asymptotic expansion\n\\[\n\\begin{aligned}\n p &= p^{(0)} + p^{(1)} Ma + p^{(2)} Ma^2 + \\mathcal{o}(Ma^2) \\\\\n u_i &= u_i^{(0)} + u_i^{(1)} Ma + u_i^{(2)} Ma^2 + \\mathcal{o}(Ma^2)\n\\end{aligned}\n\\]\nderive the equivalent system of asymptotic equations sorted by powers of \\(Ma\\).\n\nTip\nIt makes sense to rewrite the Reynold’s number in terms of the Mach number times a constant. How is this constant defined?\n\n\n\nTask 4\nDescribe in your own words what the different equations model." + "text": "Tasks\n\nTask 1\nDerive the weak formulation of Equation 1 using the following strategy\n\nWe define a indicator function (test function)\n\n\\[\n\\phi(x, t) =\n\\begin{cases}\n 1 & \\text{ for } (x, t) \\in [x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}] \\\\\n 0 & \\text{ else }\n\\end{cases}\n\\]\n\nMultiply Equation 1 by the test function and integrate over the space-time volume \\([x_{i-1/2}, x_{i+1/2}] \\times [t_n, t_{n+1}]\\).\nWe now want to extend the integration bounds to \\((-\\inf, \\inf) \\times [0, \\inf)\\). Why can we do that?\nWe want to use the fact that we can approximate \\(\\phi\\) with another test function that is continously-differentiable with arbitrary accuracy. Let’s call this new test function \\(\\tilde{\\phi}\\). Use partial integration to derive at the weak formulation of Equation 1. Simplify the expression as much as possible.\n\n\n\nTask 2\nThe statement derived in 4. indicates that the weak-formulation also makes sense in the presence of discontinuities. Why?" }, { - "objectID": "public-lecturer/content/exercises/homework06.html", - "href": "public-lecturer/content/exercises/homework06.html", - "title": "Stationary convection-diffusion", - "section": "", - "text": "****Submission Deadline: 16.07.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" + "objectID": "public-lecturer/content/exercises/homework05.html#tasks-3", + "href": "public-lecturer/content/exercises/homework05.html#tasks-3", + "title": "Galilean invariance", + "section": "Tasks", + "text": "Tasks\n\nTask 1\nShow that Equation 2 is equivalent to Equation 3:\n\\[\n\\mathbf{f}_{i+1/2}^{Roe} = \\frac{1}{2} \\left( \\mathbf{f}_l + \\mathbf{f}_r \\right) - \\frac{1}{2} \\Big| \\bar{\\mathbf{A}}(\\tilde{\\mathbf{Q}}) \\Big| \\cdot \\left( \\mathbf{Q}_R - \\mathbf{Q}_L \\right)\n\\qquad(3)\\]\nwhere \\(\\big| \\mathbf{A} \\big| = \\mathbf{R} \\Big| \\mathbf{\\Lambda} \\Big| \\mathbf{R}^{-1}\\) for a given eigen-decomposition \\(\\mathbf{A} = \\mathbf{R} \\mathbf{\\Lambda} \\mathbf{R}^{-1}\\)." }, { - "objectID": "public-lecturer/content/exercises/homework06.html#tasks", - "href": "public-lecturer/content/exercises/homework06.html#tasks", - "title": "Stationary convection-diffusion", - "section": "Tasks", - "text": "Tasks\n\nTask 1\nExplain the physical meaning of the terms (I), (II), and (III) of the heat equation.\n\n\nTask 2\nGive the SI base units of \\(t\\), \\(x\\), \\(v\\), and \\(\\lambda\\).\n\n\nTask 3\nWe introduce the dimensionless variables\n\\[\n\\begin{aligned}\n t:=t_0\\tilde{t}, \\, x:=x_0\\tilde{x}, \\, v:=v_0\\tilde{v}, \\text{and } T:=\\underbrace{\\left(T_\\mathrm{wall} - T_\\mathrm{inf}\\right)}_{T_0} \\tilde{T} + T_\\mathrm{inf}.\n\\end{aligned}\n\\]\nWrite both equation Equation 1 and the boundary conditions Equation 2 in dimensionless variables. Identify the Peclet number \\(\\mathrm{Pe}=\\frac{v_0 x_0}{\\lambda}\\).\nNow consider a physical regime characterized by \\(t_0 \\gg \\frac{x_0^2}{\\lambda}\\).\n\n\nTask 4\nHow does the equation read in this physical regime?\n\n\nTask 5\nSolve for the temperature profile and sketch the solution.\n\n\nTask 6\nHow does the profile change as the thermal diffusivity decreases? Indicate it in the sketch!\n\n\nTask 7\nIf \\(\\lambda\\) doubles, how does the velocity need to change to retain the same profile?" + "objectID": "public-lecturer/content/exercises/homework_template.html", + "href": "public-lecturer/content/exercises/homework_template.html", + "title": "Task A: import a full problem", + "section": "", + "text": "****Submission Deadline: 30.04.2024 - 23:59\n\nYour homework solution has to be handed in as a group solution via Moodle.\nClearly state name and matriculation number of each student" }, { - "objectID": "public-lecturer/content/exercises/homework06.html#tasks-1", - "href": "public-lecturer/content/exercises/homework06.html#tasks-1", - "title": "Stationary convection-diffusion", + "objectID": "public-lecturer/content/exercises/homework_template.html#tasks", + "href": "public-lecturer/content/exercises/homework_template.html#tasks", + "title": "Task A: import a full problem", "section": "Tasks", - "text": "Tasks\n\nTask 1\nInterpret the physical meaning of each of these conditions.\n\n\nTask 2\nIntroduce the similarity variable \\(\\eta := \\frac{x}{2\\sqrt{Dt}}\\) and write both temperature and mass diffusion (Equation 3), in terms of the similarity variable.\n\n\nTask 3\nThe resulting ODE system can be solved in terms of the (unknown) interface position \\(X_\\mathrm{m}=X(t)\\) and written in \\(x\\) and \\(t\\) again. Derive the solution (get inspired by the lecture).\n\n\nTask 4\nDiscuss which of the relations/boundary conditions 1. – 8. are fulfilled versus what is still unknown.\n\n\nTask 5\nMake the Ansatz: \\(X_\\mathrm{m}(t) = 2\\lambda\\sqrt{Dt}\\) (similar to lecture, but with \\(D\\) instead of \\(\\alpha\\)). Substitute the derived solutions for \\(T\\) and \\(C\\) into the Stefan condition and salt rejection and derive an algebraic system that allows us to determine \\(C_\\mathrm{i}\\), \\(T_\\mathrm{i}\\) and \\(\\lambda\\).\n\n\nTask 6\nCombine the derived equations into one equation for \\(\\lambda\\). Determine \\(\\lambda\\) for freezing sea water with \\(T_\\mathrm{B} = -10^\\circ C\\), \\(T_\\infty=2^\\circ C\\), \\(T_\\mathrm{m}=0^\\circ C\\), \\(C_\\infty=3.5\\%\\), \\(D=1.33 \\times 10^{-9}m^2s^{-1}\\) (Na-Ions in Water), \\(\\alpha_\\mathrm{ice} = 1.203 \\times 10^{9}m^2s^{-1}\\), \\(\\alpha_\\mathrm{water} = 0.14 \\times 10^{9}m^2s^{-1}\\), \\(L=334 \\times 10^{3} J\\), \\(c_p=2.05 \\times 10^{3} J kg^{-1} K^{-1}\\) and \\(m\\approx 1 K \\%^{-1}\\) (i.e., for each percent of salt the melting temperature is reduced by 1K; valid until about 20 % of salts). Plot the solution and discuss what you see." + "text": "Tasks\n\nTask 1\nIn a rotating reference frame with angular velocity \\(\\Omega\\), state the Bernoulli equation. What are the assumptions used to derive the equation?\n\n\nTask 2\nFor the fluid spinning at \\(\\Omega\\), calculate the difference in height of the fluid at points 1 and 2.\n\n\nTask 3\nCalculate the angular velocity of spinning \\(\\Omega_0\\), at which the height of the fluid at point 1 is zero.\n\n\nTask 4\nFor the fluid spinning at \\(\\Omega_0\\), calculate the pressure at point 3 in terms of the of the ambient pressure \\(p_a\\)" } ] \ No newline at end of file