preliminary version of DP NS example, not fully working so far

This commit is contained in:
NT committed 2021-03-25 12:17:16 +08:00
1 parent 2a84697faf
commit 656457ff0f
2 files changed
+42 -28

No files matched your search

+40 -28
View File
@@ -8,8 +8,9 @@
"source": [
"# Differentiable Fluid Simulations\n",
"\n",
"<br>**TODO , NEXT finish opt case, diverges? see colab example , finish texts before end.**\n",
"<br>**TODO , fix bottom row, crop in display with [1:,0:]**\n",
"<br>**TODO , NEXT finish opt case, diverges? see colab example**\n",
"\n",
"**update from diffphys-code-ns-v1-syncWith2.ipynb, diff display for target, adjust params; run optimization longer so that it properly converges**\n",
"\n",
"<br><br>\n",
"\n",
@@ -51,7 +52,7 @@
"sampling locations and time. \n",
"The index $i$ here runs over all discretized, spatial degrees of freedom in our fluid solver (we'll have $32\\times40$ below).\n",
"\n",
"In contrast to before, we are not dealing with pre-computed quantities anymore, but $x_{t_e,i}$ is a complex, non-linear function itself.\n",
"In contrast to before, we are not dealing with pre-computed quantities anymore, but now $x_{t_e,i}$ is a complex, non-linear function itself.\n",
"More specifically, the simulator starts with the initial velocity $\\mathbf{u}_0$ and density $d_0$ to compute the $x_{t_e,i}$, by $n$ evaluations of the discretized pde $\\mathcal{P}$.\n",
"This gives as simulated state and quantitiy to optimize: $x_{t_e,i} = d_{t_e} = \\mathcal{P}^n(\\mathbf{u}_0,d_0)$. We will leave $d_0$ fixed in the following, and focus on $\\mathbf{u}_0$ as our degrees of freedom.\n",
"\n"
@@ -69,7 +70,7 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 1,
"metadata": {
"id": "da1uZcDXdVcF"
},
@@ -123,7 +124,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"The last `print` verifies that our `INFLOW` grid likewise has an `inflow_loc` dimension in addition to the two spatial ones. You can test for the existence of a tensor dimension in phiflow with the `.exists` boolean, which can be evaluated for any dimension name. E.g., above `INFLOW.inflow_loc.exists` will give `True`, while `INFLOW.unknown_dim.exists` will give `False`.\n",
"The last `print` statement verifies that our `INFLOW` grid likewise has an `inflow_loc` dimension in addition to the two spatial ones. You can test for the existence of a tensor dimension in phiflow with the `.exists` boolean, which can be evaluated for any dimension name. E.g., above `INFLOW.inflow_loc.exists` will give `True`, while `INFLOW.some_unknown_dim.exists` will give `False`.\n",
"\n",
"Phiflow tensors are automatically broadcast to new dimensions via their names, and hence typically no-reshaping operations are required. E.g., you can easily add or multiply tensors with differing dimensions. Below we'll multiply a staggered grid with a tensor of ones along the `inflow_loc` dimension to get a staggered velocity that has `x,y,inflow_loc` as dimensions via `DOMAIN.staggered_grid(0) * math.ones(inflow_loc=4)`."
]
@@ -142,7 +143,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAABHgAAAFtCAYAAAB80d3MAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA8bElEQVR4nO3deZhcBZX38d/p7ux7SMjGDlEWhYAxgjCsLoACLujgjPMyMzqICuqr44yir+I64os6LoiCaMBBBVkGnBdFwACyCAQIEBKWhARISAgh6aQ7S2913j/qRpvYdW53Lbfqdn8/z5Mn3fWre+/p231P3zp9q8rcXQAAAAAAAMivpnoXAAAAAAAAgMow4AEAAAAAAMg5BjwAAAAAAAA5x4AHAAAAAAAg5xjwAAAAAAAA5BwDHgAAAAAAgJxjwDOEmdk0M7vTzNrM7Ftmdr6Z/VcG273bzA6t9XZSajjYzO6pZw3AUDPEe840M1tqZiPqWQcwlAzxnsN5DoaUIX68Z3qOsfO+zmKb6D8GPIOMma00szf18+5nSVovaby7f6qGZf2ZmZ0iqc3dH04+f42Z3Wxm683M+7j/ZDO73sy2mNmzZvZ3A9jWfDPrNLP2Xv+aJcndH5XUmtQDoEyDqeeY2QgzuyzpNW1mtsjMThrAts43s66des4+kuTuL0paoOI+AFCmwdRzdlputpltH8gDUs5zMNgNxuPdzM5IhjFbzGy5mf1NP7dV1XOMZN9uS9azNuknY/u5eOb7Gv3HgGdo21PSEncvecJRA2dL+nmvz7skXS3pAyXuf5GkTknTJP29pIvN7KABbO+b7j6217+eXtmVkj40gHUBqEyj95wWSc9LOkbSBEmfl3S1me01gO1dtVPPeaZXRs8BstXoPae3iyQ9UMb2OM8Bihr+eDezN0u6QNI/SRon6WhJz/R13xKqfY5xiruPlTRH0qGSPtvP5cre12bWMtBlMDAMeAYxM/tHM7vLzC40s41mtmLHX6PNbL6kMyX9WzK5/avpuJmdamaPm1mrmd1uZgckt/+Tmf2m1/2eNrNf9/r8eTOb08f6hks6XtIdO25z9yfd/TJJj/dx/zGS3i3p/7h7u7vfJelGSf9Q5i7Z2e2STsjqckZgsMt7z3H3Le5+vruvdPeCu/+PpBWSXlf2Tnml+yTtY2Z7Vml9wJCW957Ta7kzJLVKum2g+yDF7eI8B4PEIDnevyTpy+7+p+Q8Y7W7ry5jd/Sl7HMMd18r6WYVBz2SJDM73MzuSfbXI2Z2bHL7fO20r82sycw+k1yR9LKZXW1mk5P772VmbmYfMLPnJP0huf2frXgl00YrXvW0Z69tu5mdnXwvWs3sIjOzXvm/JMu2mdkSMzssuX2mmV1rZi8lPx8fG+i+GAwY8Ax+b5D0pKQpkr4p6TIzM3f/RxUnvTv+8nNr74XM7FWSfinpE5KmSrpJ0m+SZnaHpL9JDuaZkoZLOiJZbh9JYyU92kctsyUV3H1VP2t/laRud3+q122PSBrIFTwfMbMNZvagmb27d5A01C5Jrx7A+gDE8txzXsHMpqnYh0o+MOvDKUnPedzMPtw7cPduScskHVJOPQD6lOueY2bjJX1Z0if7/RW/Euc5GEpye7xb8emTcyVNNbNlZrbKzH5gZqMG8PXX5BzDzHaTdFKyvMxslqT/J+mrkiZL+ldJ15rZ1BL7+lxJ71DxCuiZkjaqeFVib8dIOkDSW83sNEnnSXqXit+PP6r4/ent7ZJeL+lgSe+V9NaktvdIOl/S/5I0XtKpkl42syZJv1HxseIsSSdI+oSZvXWg+yPvGPAMfs+6+6XJJbuXS5qh4tOd0vytpP/n7re4e5ekCyWNkvTG5HLANhWnvEerOPF9wcz2V/Hg/aO7F/pY58Rkuf4aK2nzTrdtUvGSxv74norNd1dJ/0fSfDM7cqf7tCV1AaiOPPecPzOzYSqewFzu7k/0c7GrVTx5mSrpXyR9wczet9N96DlAdeW953xF0mVlDqI5z8FQk+fjfZqkYZJOl/Q3+svToj7fz+VrcY7x32bWpuLT09dJ+mJy+/sl3eTuNyVXGt0iaaGkk0us52xJn3P3Ve7eoeIA5nR75dOxzk+ulN6W3P8/3H1pMpj6uqQ5O1199A13b3X351R8faE5ye0fVHG49IAXLXP3Z1UcBk119y+7e2fyfb1U0hkD2B+DAs+BG/zW7vjA3bcmV7f15wW0Zkp6tteyBTN7XsWJqFScdh8rab/k41YVm+AR6nWp4k42qv/DGUlqV3Ey29t49bOZuvtDvT69ycyuVHFSfHev28epWDuA6shzz5EkJX8F+rmKr/91Tn+Xc/clvT69x8y+q+KJXO+/StFzgOrKbc9JnvbxJhUf5A0Y5zkYgnJ7vEvalvz/fXdfI0lm9m0VBzyfS1u4RucY73D3W83sGEm/UPHKqFYVX2PnPfbKF2kfpuKgpS97SrrezHoPwnr0yuHb8zvd/7v2ynfgMhW/Hzu+T2t7ZVv1l+/z7pKWl6hhppm19rqtWcWrg4YUruBBKS+oeKBIkpLnPe4uacfzRHc0wr9JPr5DxUZ4jEo3wmXJqmaVyHf2lKQWM5vd67ZDNLCnS/TmKjYPSX++/HC4ipd6AqivRug5O7Z7mYonJe9O/tJXrp17TouKJ4+PVLBOANXRCD3nWEl7SXrOzNaq+DSId5vZQ9FCAc5zgL7V/Xh3942SVql4nP755n5/BX2sUlU6x3D3OyTNV/HKJqk4jPm5u0/s9W+Mu3+jxCqel3TSTvcfudPrC/lO9//QTvcf5e739KPc5yXtW+L2FTutc5y7l7rqaNBiwINSrpb0NjM7IXmqwqckdUjaceDdIek4SaOSy4r/KOlESbtIerivFbp7p6RbVWyWkopd0cxGqngCIjMbacmLAbr7FknXSfqymY1JLjs+Tcmr1dtfXrRrr762Z2anm9nY5Dm1b1HxcsMbe93lGEl/SC4lBFBfde85iYtVvAT6lOQy4ldIes6xfW3PzE4zs0nJNuZJ+pikG3rdZZ6klcmlxADqqxF6ziUqPlCZk/z7kYqve7HjtSY4zwGqoxGOd0n6maRzzWxXM5sk6X9L+p9ey1ftHMPMjrUSb9Vewn9KerOZHSLpv1R8vZ+3mllz8nUca8XX6unLjyR9zZKnWJnZVCu+zk4pP5L0WUveGdnMJljxtXX64yeS/tXMXpfsi/2S7d4vqc3M/t3MRiV1v8bMXt/P9Q4aDHjQJ3d/UsUThe9LWi/pFBUf8HQm+VMqPoXqj8nnm1V8m7+7/ZVv0bmzH+uV74K1p4qXLO64KmebXvmXpo+o+BzZdSpegvhhd99x391VvIyv1KvPfzzJWiX9X0n/4u6398r/XsUGA6DOGqHnJCcIH1LxgdZaK747RLuZ/X2S767iU0QfK7GtM1T8i16bpCskXeDul/fK6TlAg2iEnuPuW9197Y5/yfa2u/tLyX05zwGqoBGO98RXJD2g4rMUlqo4PPqaVJNzjN31lwFWqqTvXCHpC+7+vIp/VD9P0ksqXh3zaZWeHXxXxeHy7634mj5/UvEFsUtt63oV3y7+V2a2WdJiFV/kuT91/lrFffYLFffFf0uanHyf3q7iOdwKFb/PP5E0oT/rHUzMB/729UBFzOxuSee4e58T8QGs5/OSXnL3H5ex7MGSfuzuR1RSA4DGV8We835JB7n7Z8tYdlcV/0J4qLtvr6QOAI2N8xxg6GjUcwwz+4mkX7v7zZXUhfxhwAMAAAAAAJBzPEULAAAAAAAg5xjwAAAAAAAA5BwDHgAAAAAAgJxryXJjA3yrNgCDx3p3n5r1Ruk5wJBVl54j0XeAocrdrR7bpecAQ1af5zqZDniKmrPfJIA663m2ftum5wBDTz17jkTfAYaa6J20s0DPAYaevs91eIoWAAAAAABAzjHgAQAAAAAAyDkGPAAAAAAAADnHgAcAAAAAACDnGPAAAAAAAADkHAMeAAAAAACAnGPAAwAAAAAAkHMMeAAAAAAAAHKOAQ8AAAAAAEDOMeABAAAAAADIOQY8AAAAAAAAOceABwAAAAAAIOcY8AAAAAAAAOQcAx4AAAAAAICcY8ADAAAAAACQcwx4AAAAAAAAco4BDwAAAAAAQM4x4AEAAAAAAMg5BjwAAAAAAAA5x4AHAAAAAAAg5xjwAAAAAAAA5BwDHgAAAAAAgJxjwAMAAAAAAJBzDHgAAAAAAAByjgEPAAAAAABAzjHgAQAAAAAAyDkGPAAAAAAAADnHgAcAAAAAACDnGPAAAAAAAADkHAMeAAAAAACAnGPAAwAAAAAAkHOpAx4zG2lm95vZI2b2uJl9Kbl9vpmtMLNFyb85Na8WwKBHzwGQNfoOgCzRcwDUSks/7tMh6Xh3bzezYZLuMrPfJtmn3f2a2pUHYAii5wDIGn0HQJboOQBqInXA4+4uqT35dFjyz2tZFIChi54DIGv0HQBZoucAqJV+vQaPmTWb2SJJ6yTd4u73JdHXzOxRM/uOmY0osexZZrbQzBZWp2QAgx09B0DW6DsAskTPAVALVhwg9/POZhMlXS/pXEkvS1orabikSyQtd/cvpyzvUnPZxQLIq54H3X3uQJei5wAoT3k9R6LvAChHj9zdylmSngOgPH2f6wzoXbTcvVXSAkknuvsaL+qQ9DNJ86pSJwAk6DkAskbfAZAleg6AaurPu2hNTSbLMrNRkt4s6Qkzm5HcZpLeIWlx7coEMFTQcwBkjb4DIEv0HAC10p930Zoh6XIza1ZxIHS1u/+Pmf3BzKZKMkmLJJ1duzIBDCH0HABZo+8AyBI9B0BNDOg1eCreGM8RBYao8l8PoxL0HGCoqk/Pkeg7wNBU/mvwVIqeAwxVVXgNHgAAAAAAADQeBjwAAAAAAAA5x4AHAAAAAAAg5xjwAAAAAAAA5BwDHgAAAAAAgJxjwAMAAAAAAJBzDHgAAAAAAAByjgEPAAAAAABAzjHgAQAAAAAAyDkLine truncated
"text/plain": [
"<Figure size 1152x360 with 4 Axes>"
]
@@ -171,8 +172,7 @@
"for i in range(INFLOW.shape.inflow_loc):\n",
" axes[i].imshow(smoke.values.inflow_loc[i].numpy('y,x'), origin='lower', cmap='magma')\n",
" axes[i].set_title(f\"Inflow {math.to_int(INFLOW_LOCATION).inflow_loc[i].vector.unstack_spatial('x,y')}\" + (\", Reference\" if i==3 else \"\"))\n",
"pylab.tight_layout()\n",
"\n"
"pylab.tight_layout()\n"
]
},
{
@@ -223,7 +223,8 @@
" for _ in range(20):\n",
" smoke,velocity = step(smoke,velocity)\n",
" \n",
" loss = field.l2_loss(diffuse.explicit(smoke - field.stop_gradient(smoke.inflow_loc[-1]), 1, 1, 10))\n",
" #loss = field.l2_loss(diffuse.explicit(smoke - field.stop_gradient(smoke.inflow_loc[-1]), 1, 1, 10))\n",
" loss = field.l2_loss(smoke - field.stop_gradient(smoke.inflow_loc[-1]) )\n",
" \n",
" return loss, smoke, velocity\n"
]
@@ -252,7 +253,7 @@
{
"data": {
"text/plain": [
"(x=33, y=40) float32 -1.1465684 < ... < 1.2370852"
"(x=33, y=40) float32 -0.9229158759117126 < ... < 2.964700937271118"
]
},
"execution_count": 5,
@@ -291,7 +292,7 @@
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1152x360 with 8 Axes>"
]
@@ -342,26 +343,36 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization step 0, loss: 22.651701\n",
"Optimization step 1, loss: 22.533409\n",
"Optimization step 2, loss: 22.277126\n",
"Optimization step 3, loss: 22.404198\n",
"Optimization step 4, loss: 22.268917\n",
"Optimization step 5, loss: 22.391558\n",
"Optimization step 6, loss: 22.448061\n",
"Optimization step 7, loss: 22.387615\n",
"Optimization step 8, loss: 24.646418\n",
"Optimization step 9, loss: 26.083023\n"
"Optimization step 0, loss: 62.215240\n",
"Optimization step 1, loss: 62.544254\n",
"Optimization step 2, loss: 62.061436\n",
"Optimization step 3, loss: 63.683025\n",
"Optimization step 4, loss: 64.774864\n",
"Optimization step 5, loss: 71.795349\n",
"Optimization step 6, loss: 74.215714\n",
"Optimization step 7, loss: 60.461643\n",
"Optimization step 8, loss: 65.317680\n",
"Optimization step 9, loss: 65.126022\n",
"Optimization step 10, loss: 65.193939\n",
"Optimization step 11, loss: 65.325432\n",
"Optimization step 12, loss: 65.471474\n",
"Optimization step 13, loss: 65.525093\n",
"Optimization step 14, loss: 64.756439\n",
"Optimization step 15, loss: 65.134476\n",
"Optimization step 16, loss: 64.554466\n",
"Optimization step 17, loss: 65.206245\n",
"Optimization step 18, loss: 66.495720\n",
"Optimization step 19, loss: 66.141006\n"
]
}
],
"source": [
"#initial_velocity = DOMAIN.staggered_grid(0) * math.ones(inflow_loc=4)\n",
"initial_velocity = DOMAIN.staggered_grid(0) * math.ones(inflow_loc=4) # reset\n",
"LR = 1e-02\n",
"\n",
"sim_grad_wloss = field.functional_gradient(simulate, wrt=[1], get_output=True)\n",
"\n",
"for optim_step in range(10):\n",
"for optim_step in range(20):\n",
" initial_smoke = DOMAIN.grid(math.zeros(inflow_loc=4))\n",
" \n",
" # sim_grad__wloss returns: [loss,s,v,velocity _grad] \n",
@@ -389,7 +400,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x360 with 6 Axes>"
]
@@ -416,7 +427,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1YAAAFgCAYAAAC44OjyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABLaElEQVR4nO3de7xcdX3v/9eb3LgTQjDEBAyFWKoexHYX2p+15aeA2FvoOYqoR+M5cCht6Wl/9mKsVixqi22tttXWkwoSrRUo1hItNXL9eakiQblfSqRQAuESQuQaQsLn/LHWhsnea+09a8+stWbm+34+HvuRme98Z813Zc+89/quy2cUEZiZmZmZmdnM7db2AMzMzMzMzIadJ1ZmZmZmZmY98sTKzMzMzMysR55YmZmZmZmZ9cgTKzMzMzMzsx55YmVmZmZmZtaj2W0PwCxlJ0qxucdlXAfrIuLEvgzIzEaaM8fMmpJi3nhiZdaizcD6HpchWNiPsZjZ6HPmmFlTUswbT6zM2rZbj2fkPvdcf8ZhZmlw5phZUxLLG0+szNqWWOiYWcucOWbWlMTyxhMrszZJvYeOmVm3nDlm1pQE8yattTUzMzMzM6uBj1iZtS2xvTlm1jJnjpk1JbG88cTKrE0JHiY3sxY5c8ysKQnmjSdWZm1LLHTMrGXOHDNrSmJ5k9bampmZmZmZ1cBHrMzaltjeHDNrmTPHzJqSWN54YmXWpgTPPzazFjlzzKwpCeZNWmtrNoh22623HzOzKmrOHEknSrpD0gZJqwoenyfpwvzxayQty9uXSXpa0vX5z6f6v/Jm1qjEtnF8xMrMzMz6QtIs4JPA8cBG4FpJayPi1o5upwKPRsThkk4BPgK8OX/sBxFxVJNjNjPrF0+szNqU4GFyM2tR/ZlzNLAhIu7KXk4XACuAzonVCuAD+e2LgU9IUp2DMrMWJLiN44mVWdsSCx0za1m9mbMEuLfj/kbgmLI+EbFD0g+BA/LHDpX0feAx4H0R8Y06B2tmNUtsG8cTK7O2JRY6Ztay3jNnoaT1HfdXR8TqXhcKbAIOiYhHJP0E8M+SXh4Rj/Vh2WbWhsS2cTyxMjMzsyo2R8RYyWP3AQd33F+atxX12ShpNrAf8EhEBPAMQERcJ+kHwEuB9ZiZDQFPrMzalOD5x2bWovoz51pguaRDySZQpwBvndBnLbAS+DbwRuDKiAhJBwJbImKnpB8BlgN31TlYM6tRgts4nliZtS2x0DGzltWYOfk1U2cC64BZwHkRcYuks4H1EbEWOBf4nKQNwBayyRfAzwJnS3oWeA44IyK21DZYM6tfYts4nliZtSnBvTlm1qIGMiciLgUundD2/o7b24A3FTzvi8AXax2cmTUnwW2ctNbWzMzMzMysBj5iZda2xPbmmFnLnDlm1pTE8iattTUbRLvt1ttPFySdKOkOSRskrSp4fJ6kC/PHr5G0rN+raWYDooHMMTMDkssbH7Eya1MD5x9LmgV8Ejie7Ms6r5W0NiJu7eh2KvBoRBwu6RTgI8Cbax2YmTUvwWsezKwlCeaNJ1Zmbas/dI4GNkTEXQCSLgBWAJ0TqxXAB/LbFwOfkKT8e2XMbJQktqFjZi1KLG/SWluzNC0B7u24vzFvK+wTETuAHwIHNDI6MzMzsxHgI1ZmberPYfKFktZ33F8dEat7XaiZjaAET80xs5YkmDeeWJm1rffQ2RwRY1M8fh9wcMf9pXlbUZ+NkmYD+wGP9DowMxtAiW3omFmLEssbT6zM2lZ/6FwLLJd0KNkE6hTgrRP6rAVWAt8G3ghc6eurzEZUYhs6ZtaixPImrbU1S1B+zdSZwDrgNuCiiLhF0tmSfjnvdi5wgKQNwLuASSXZzczMzAbNTL9SRtLRkq7Pf26Q9Cu9jsVHrMza1ND5xxFxKXDphLb3d9zeBryp9oGYWbsSvObBzFoy+F8pczMwFhE7JC0GbpD05XyH9Ix4YmXWNm/kmFmTnDlm1pTB/kqZpzr67A70fAnEyKWrpH+VtHKKxz8l6Q+7XNbVkk7r3+ieX25IOrzHZdwi6dj+jKjS6y6S9HVJj0v6aJ+WeaCk2yXt0Y/l9TCO35T0kYZfNLlvJR81zpx6jXjm/JKkCxt+UWfOEHPe1GvE82ZUt3F6+koZScdIugW4CTijl6NVMCQTK0l3Szqum74R8YaIWJM/752Svjnh8TMi4oN1jLNJEfHyiLgaQNIHJP19Qy99OrAZ2DcifqdPy1wFnB8RTwNIOlnSv0l6StLVEztLOkrSdfnj10k6qtsXyt9LT0t6Iv/5WsfDfwe8TdKLelwfG3LOnMlSzRxJL5V0iaSHJW2RtE7Sj3b7QvnG67aOzLlj/LGI+DLwcklH9mm9bAg5byZLNW86SXpHPkntevI7ots4CyWt7/g5vZ8Lj4hrIuLlwE8C75G0ey/LG4qJlQ2UlwC3zqRinLIy3hPb5pFVo+sMzS3Ax4FzCvrPBS7J++8PrAEuydu79UsRsXf+c8J4Y36d0b8C76iwrN5577HZVFrNHGA+WdXMHwUWAd8ly6AqzuzInImTsi+Qbcw1x5ljVqbtvBl/3v7AHwC3VB0Ho7eNszkixjp+Jn5PZ5WvlBn/PU36SpmIuA14AnhFT6vby5PbML6HRtKfS3pU0n9IekPH41dLOk3SjwGfAn46n7VvzR8/X9KH8tv7S/pKvify0fz20i7G8OJ8j8CCjrZXSdosaU5+/39Kui1f7jpJLylZ1n6SPpuP4R5J75O0W8fj/ytfzuOSbpX043n73ZKOk3Qi2Yfvzfl63iDpTZKum/A675I0aWOgYt/zyQLi9/PXOk5ZpZWPS7o///l4HiRIOlbSRknvlvQA8JmC/4JjgK0RsXG8ISIuj4iLgPsL+h9Ldm3gxyPimYj4K0DAawv6zsTVwC/0aVnd8UbOQHPmpJ05EfHdiDg3IrZExLPAx4AflXRA0f/vDFyNM8dyzpu086bDnwB/RXb0rJ+uZvTy5vmvlFG2k/0Usp1hndaS/W6h4ytl8ufMBsjfw0cAd/e0ur08uUXHAHcAC4E/Bc6VpM4O+czzDODb+ax9fsFydiP7ILwEOAR4GvjEdC8eEfeTfd/Pf+tofitwcUQ8K2kFWRD8V+BA4BtkeyWL/DXZzPlHgJ8j25PwPyALBLKL7d4B7Av8MpNn2F8F/hi4MF/PV5K9gQ7Ng3fc24HPFrx+130j4p3A54E/zV/rcuC9wE8BRwGvJLuI8H0dTzsIWED2f1y0V/a/kP0uu/Vy4MYJe5NuzNu79fk85L8m6ZUTHruNbD2a4esdhoUz54WxpJY5E/0s8EBEVPkC7T/JN0q/pcnXjdwGLJO0bw9j6p4zZxg4b14YS3J5I+loYIxs4jwTSW3j9PiVMj9DVgnweuBLwK9HRE+T2WFNyHsi4u8iYifZqWCLyU7RqCQiHomIL0bEUxHxOPBhsg9+N/4BeAtAHnin5G2Qhd2fRMRt+S/8j4GjJu7RUVYi8hTgPRHxeETcDXyU7EMPcBrZB/zayGyIiHu6WK9ngAuB/56/zsuBZcBXeulb4m3A2RHxUEQ8DPxRx/gBngPOyo8uPV3w/PnA412+FsDeZBcddvohsE+F8S4jC8GrgHWS5nc8/jjZHwGzTs6cqddrlDPnefne/k+S/WHu1rvJNiqXAKuBL0s6rOPx8bHMn8mYbCQ5b6Zer5HNm/z/7G/ITh9+rtvnTRjvMhLbxomISyPipRFxWER8OG97f0SszW9vi4g3RcThEXF05BUEI+JzkV3Pd1RE/HhE/HOvYxnWidUD4zfihVKJe1ddiKQ9Jf2f/PD0Y8DXgfn5G3s6XyQ7BL+YbA/mc2R7bSB7Q/+lpK3KDs9vITtdbWKVkoXAHKAzSO7p6Hcw8IOq65VbA7w1D8S3k83gn+lD34lezOTxv7jj/sORnddb5lG6nxRBdv7rxD27+9JlcEXEtyLi6fwPzZ8AW4HXdHTZh8kTt3p57/EwcOZMb1QzB8gqewFfA/4mIsr2zk8S2YXRj+cbXmuAbwE/39FlfCxbq45pxpw5g855M71RzZtfJzsr5zsVnvM8b+O0b/hGXM10Fx/+DtkFycdExL5k4QFZQEy94IhHyf7IvpnsEPkFEc+fnnYv8KsRMb/jZ4+I+LcJi9kMPEsWUuMO4YWL7u4FDmN6k9Yz/1BuJ/tAvRX43BTr0nXfAvczefyd5w1P9zu4EXhphde7BThywmkRRzKzCzwhG1/nsn4MuGGGy6rOp+WMGmfO6GXO+IXkXwPWju8N7UFR5twdEY/1uNzuOHNGifNm9PLmdcCvSHogv27r/wE+KmnaUzhLeBunYcM34moeBJaqvGLcPmTnHG9VdpHmWRWX/w9k5wa/kRcOkUN2Xux78kPO4xdvvmnik/PD/BcBH5a0T34Y/V28UD3m08DvSvoJZQ6feKi9Yz2XqeOC0Nxnyc6nfjYivjn5aTPu2+kLwPuUfU/DQuD97Fr9ZjrfJduD9vyeLkmzlJW7nA3sJml35RfMkl14uRP438ouKj0zb78yf+47Jd1d9EKSDpH0aklz82X+HtketW91dPs5sqo5zUksdEacM2fEMkfZtU/rgG9FxKqJC1N2AXvhxpWk+ZJeny9vtqS3kW3cfrWjmzPHZsp5M2J5A7yTbPJzVP6znuz0w/fmz/U2zoAbvhFXcyXZkYwHJBVdjPZxYA+yvSrfYdc/dt1YCywnu5D5+T0AEfEl4CPABfnh95uBNxQvgt8EngTuAr5JFl7n5cv5R7Jzov+B7FS3fya7SHKif8z/fUTS9zraP0dWNrKbEKjSt9OHyD74N5J9udr38rauRMR24Hzy859zbyf7Y/C3ZHuYnib7/oXx/ieRhf1W4H8CJ+XtkJ1a0BkinfbJl/ko2R6zE4E3RH4Reh50P0922kBzEgudEefMGbHMAX6F7PtN/ode+G6YJyQdkj9+MDBxT/24OfnYHib7nf8mWV79e0eftwD/p9vLine truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 864x360 with 6 Axes>"
]
@@ -442,7 +453,9 @@
"source": [
"## Re-simulation\n",
"\n",
"Most importantly, we can also visualize how the full simulation over the course of 20 steps turns out given the new initial conditions for each of the inflow locations. This is what happened internally at optimization time, and was measured by our loss function, but it's good to get an intuition for which solution the optimization has found.\n"
"Most importantly, we can also visualize how the full simulation over the course of 20 steps turns out given the new initial conditions for each of the inflow locations. This is what happened internally at optimization time, and was measured by our loss function, but it's good to get an intuition for which solution the optimization has found.\n",
"\n",
"Below, we re-run the forward simulation with the new initial conditions from `initial_velocity`:\n"
]
},
{
@@ -452,7 +465,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1152x360 with 4 Axes>"
]
@@ -464,7 +477,6 @@
}
],
"source": [
"# re-run sim\n",
"smoke = initial_smoke \n",
"velocity = initial_velocity\n",
"\n",
+2
View File
@@ -300,6 +300,8 @@ By default DL frameworks store the internal states for every differentiable oper
If we take a step back and look at $p = (\nabla^2)^{-1} b$, it's gradient $\partial p / \partial b$
is just $((\nabla^2)^{-1})^T$. And in this case, $(\nabla^2)$ is a symmetric matrix, and so $((\nabla^2)^{-1})^T=(\nabla^2)^{-1}$. This is the identical inverse matrix that we encountered in the original equation above, and hence we can re-use our unmodified iterative solver to compute the gradient. We don't need to take it apart and slow it down by storing intermediate states. However, the iterative solver computes the matrix-vector-products for $(\nabla^2)^{-1} b$. So what is $b$ during back-propagation? In an optimization setting we'll always have our loss function $L$ at the end of the forward chain. The back-propagation step will then give a gradient for the output, let's assume it is $\partial L/\partial p$ here, which needs to be propagated to the earlier operations of the forward pass. Thus, we can simply invoke our iterative solve during the backward pass to compute $\partial p / \partial b = S(\partial L/\partial p)$. And assuming that we've chosen a good solver as $S$ for the forward pass, we get exactly the same performance and accuracy in the backwards pass.
If you're interested in a code example, the [differentiate-pressure example]( https://github.com/tum-pbs/PhiFlow/blob/master/demos/differentiate_pressure.py) of phiflow uses exactly this process for an optimization through a pressure projection step: a flow field that is constrained on the right side, is optimized for the content on the left, such that it matches the target on the right after a pressure projection step.
The main take-away here is: it is important _not to blindly back-propagate_ through the forward computation, but to think about which steps of the analytic equations for the forward pass to compute gradients for. In cases like the above, we can often find improved analytic expressions for the gradients, which we can then compute numerically.
```{admonition} Implicit Function Theorem & Time