diff --git a/_toc.yml b/_toc.yml index 535a34c..b804206 100644 --- a/_toc.yml +++ b/_toc.yml @@ -6,8 +6,8 @@ - file: overview.md sections: - file: overview-equations.md - - file: overview-burgers-forw-v2.ipynb - - file: overview-ns-forw-v2.ipynb + - file: overview-burgers-forw.ipynb + - file: overview-ns-forw.ipynb - file: supervised sections: - file: supervised-airfoils.ipynb @@ -26,8 +26,8 @@ - file: diffphys-outlook.md - file: old-phiflow1.md sections: - - file: overview-burgers-forw.ipynb - - file: overview-ns-forw.ipynb + - file: overview-burgers-forw-v1.ipynb + - file: overview-ns-forw-v1.ipynb - file: diffphys-code-ns.ipynb - file: jupyter-book-reference sections: diff --git a/diffphys-code-ns-v2a.ipynb b/diffphys-code-ns-v2a.ipynb index 9c2f640..ff67f16 100644 --- a/diffphys-code-ns-v2a.ipynb +++ b/diffphys-code-ns-v2a.ipynb @@ -8,7 +8,14 @@ "source": [ "# Differentiable Fluid Simulations\n", "\n", - "** test version, rough... not newest one **\n", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", + "\n", + "**test version, rough... not newest one**\n", + "\n", + "\n", + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", + "\n", + "\n", "\n", "Next, we'll target a more complex example with the Navier-Stokes equations as model. We'll target a 2D case with velocity $\\mathbf{u}$, no explicit viscosity term, and a marker density $d$ that drives a simple Boussinesq buoyancy term $\\eta d$ adding a force along the y dimension:\n", "\n", diff --git a/overview-burgers-forw-v1.ipynb b/overview-burgers-forw-v1.ipynb new file mode 100644 index 0000000..f1c674c --- /dev/null +++ b/overview-burgers-forw-v1.ipynb @@ -0,0 +1,224 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple forward simulation of Burgers equation\n", + "\n", + "how to run ...\n", + "simple model equation \n", + "$\n", + " \\frac{\\partial u}{\\partial{t}} + u \\nabla u =\n", + " \\nu \\nabla\\cdot \\nabla u\n", + "$ \n", + "\n", + "Note, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (Skip or modify this command if necessary.)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note, the velocity array has a batch dimension, and 1 channel component in this 1D case: (1, 128, 1)\n", + "\n", + "Initial velocity state: [[1.2246469e-16]\n", + " [4.9453720e-02]\n", + " [9.8786421e-02]\n", + " [1.4787737e-01]\n", + " [1.9660644e-01]] ...\n", + "\n", + "Last velocity: [[0.00552158]\n", + " [0.0165598 ]\n", + " [0.02760994]\n", + " [0.03866227]\n", + " [0.04973169]\n", + " [0.06080895]\n", + " [0.07190682]\n", + " [0.08301631]\n", + " [0.09414805]\n", + " [0.10529345]] ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", + " for key in self._mapping:\n", + "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", + " yield (key, self._mapping[key])\n", + "/home/thuerey/phiflow/phi/viz/display.py:80: UserWarning: GUI is disabled because of missing dependencies: No module named 'imageio'. To install all dependencies, run $ pip install phiflow[gui]\n", + " warnings.warn('GUI is disabled because of missing dependencies: %s. To install all dependencies, run $ pip install phiflow[gui]' % import_error)\n" + ] + } + ], + "source": [ + "!pip install --upgrade --quiet phiflow\n", + "from phi.flow import *\n", + "\n", + "# run with phiflow\n", + "n = 128\n", + "steps = 32\n", + "dt = 1./steps\n", + "viscosity = 0.01/np.pi\n", + "initial = np.asarray( [ [-math.sin(np.pi * x) * 1.] for x in np.linspace(-1,1,n)] )\n", + "\n", + "domain = Domain([n], boundaries=PERIODIC, box=box[-1:1])\n", + "state = [BurgersVelocity(domain, velocity=initial, viscosity=viscosity)]\n", + "\n", + "print(\"Note, the velocity array has a batch dimension, and 1 channel component in this 1D case: \"+ format(state[0].velocity.data.shape) ) # -> (1, 128, 1)\n", + "print(\"\\nInitial velocity state: \" + format(state[0].velocity.data[0][0:5]) +\" ...\" )\n", + "\n", + "for i in range(32):\n", + "\n", + " v = state[-1].velocity\n", + " v = diffuse(v, dt * viscosity, substeps=1)\n", + " v = advect.semi_lagrangian(v, v, dt)\n", + " state.append( state[-1].copied_with(velocity=v, age=v.age + dt) )\n", + "\n", + " # here, we manually execute the different components of the PDE for clarity, \n", + " # in phiflow we could simply use the step() method of the Burgers() class:\n", + " #state.append( Burgers().step(state[-1], dt=dt) )\n", + " \n", + "print(\"\\nLast velocity: \" + format(state[-1].velocity.data[0][0:10]) +\" ...\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far so good, but not so easy to evaluate. Show in graph: blue is initial state, then times $10/32, 20/32, 1$ in green, cyan and purple:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# we only need \"velocity.data\" from each phiflow state\n", + "vels = [x.velocity.data for x in state]\n", + "\n", + "# print(vels[0][0,:,0].shape)\n", + "# print(vels[0].shape[1])\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig = plt.figure().gca()\n", + "fig.plot(np.linspace(-1,1,len(vels[ 0].flatten())), vels[ 0].flatten(), lw=2, color='blue')\n", + "fig.plot(np.linspace(-1,1,len(vels[10].flatten())), vels[10].flatten(), lw=2, color='green')\n", + "fig.plot(np.linspace(-1,1,len(vels[20].flatten())), vels[20].flatten(), lw=2, color='cyan')\n", + "fig.plot(np.linspace(-1,1,len(vels[32].flatten())), vels[32].flatten(), lw=2, color='purple')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And as image..." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vels array shape: (1, 128, 33, 1)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def show_state(a):\n", + " # we only have 33 time steps, blow up by a factor of 2^4 to make it easier to see\n", + " # (could also be done with more evaluations of network)\n", + " for i in range(4):\n", + " a = np.concatenate( [a,a] , axis=3)\n", + "\n", + " a = np.reshape( a, [a.shape[1],a.shape[2]*a.shape[3]] )\n", + " #print(\"resulting image size\" +format(a.shape))\n", + " plt.imshow(a, origin='upper', cmap='magma')\n", + " \n", + "vels_img = np.asarray( np.concatenate(vels, axis=-1), dtype=np.float32 )\n", + "vels_img = np.reshape(vels_img, list(vels_img.shape)+[1] ) ; print(\"Vels array shape: \"+format(vels_img.shape))\n", + "\n", + "# save for comparison with reconstructions later on\n", + "np.savez_compressed(\"./temp/burgers-groundtruth-solution.npz\", np.reshape(vels_img,[n,steps+1])) # remove batch & channel dimension\n", + "\n", + "show_state(vels_img)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/overview-burgers-forw-v2.ipynb b/overview-burgers-forw-v2.ipynb deleted file mode 100644 index 472b74a..0000000 --- a/overview-burgers-forw-v2.ipynb +++ /dev/null @@ -1,316 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simple Forward Simulation of Burgers Equation with ΦFlow\n", - "\n", - "This chapter will give an introduction for how to run _forward_, i.e., regular simulations starting with a given initial state and approximating a later state numerically, with ΦFlow.\n", - "\n", - "Burgers equations is a very simple, yet non-linear and non-trivial, model equation, and hence a very good starting point for experiments. It contains an advection term (motion / transport) and a diffusion term (dissipation due to the second law of thermodynamics). Burgers equation can already lead to interesting shock formations, and is given by:\n", - "$\n", - " \\frac{\\partial u}{\\partial{t}} + u \\nabla u =\n", - " \\nu \\nabla\\cdot \\nabla u\n", - "$ \n", - "\n", - "Let's get some preliminaries out of the way: we'll import the ΦFlow library, and define our simulation domain with $n=128$ cells as discretization points for the 1D velocity $u$ in a periodic domain $\\Omega$ for the interval $[-1,1]$. We'll use 32 time `steps` for a time interval of 1, giving us `dt=1/32`. Additionally, we'll use a viscosity of $\\nu=0.01/\\pi$.\n", - "\n", - "We'll also define an initial state given by $-\\text{sin}(\\pi x)$ in the numpy array `initial`, which we'll use to initialize the velocity $u$ in the simulation in the next cell.\n", - "\n", - "**Note:** Below, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (You can skip or modify this command if necessary, depending on your system.)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using phiflow version: 2.0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/thuerey/miniconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " for key in self._mapping:\n", - "/Users/thuerey/miniconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " yield (key, self._mapping[key])\n" - ] - } - ], - "source": [ - "#!pip install --upgrade --quiet phiflow\n", - "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", - "\n", - "from phi.flow import *\n", - "import phi\n", - "print(\"Using phiflow version: {}\".format(phi.__version__))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we've loaded phiflow, we can start defining some globals and constants. The `initial` array contains the aforementioned sine wave that we'll use to produce a nice shock in the center of our domain." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "n = 128\n", - "steps = 32\n", - "dt = 1./steps\n", - "nu = 0.01/np.pi\n", - "\n", - "initial = np.asarray( [-np.sin(np.pi * x) * 1. for x in np.linspace(-1,1,n)] ) # 1D array\n", - "#initial = np.asarray( [ [-np.sin(np.pi * x) * 1.] for x in np.linspace(-1,1,n)] ) # with additional component channel" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we can define the `domain` to contain $\\Omega$, as outlined above periodically for $[-1,1]$. We also initialize a 1D `velocity` from the `initial` array.\n", - "\n", - "Just to illustrate, we'll also print some info about the velocity object: it's a `phiflow.math` tensor with a size of 128. Note that the actual grid content is contained in the `values` of the grid. Below we're printing the first five entries via the conversion to a numpy array with `numpy()`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Velocity tensor shape: (x=128)\n", - "Velocity tensor type: \n", - "Velocity tensor content: [1.2246469e-16 4.9453720e-02 9.8786421e-02 1.4787737e-01 1.9660644e-01]\n" - ] - } - ], - "source": [ - "domain = Domain(x=n, boundaries=PERIODIC, bounds=Box[-1:1])\n", - "velocity = domain.scalar_grid(initial)\n", - "#velocity = domain.grid(Noise(vector=1))\n", - "#dont use: velocity = domain.staggered_grid(initial) , velocity = domain.grid(initial) \n", - "\n", - "print(\"Velocity tensor shape: \" + format( velocity.shape )) # == velocity.values.shape\n", - "print(\"Velocity tensor type: \" + format( type(velocity.values) ))\n", - "print(\"Velocity tensor content: \" + format( velocity.values.numpy()[0:5] ))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running the simulation\n", - "\n", - "Now we're ready to run the simulation itself. To compute the diffusion and advection components of our model equation we can simply call the existing `diffusion` and `semi_lagrangian` operators in phiflow:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New velocity content at t=1.0: [0.00274862 0.01272991 0.02360343 0.03478042 0.0460869 ]\n" - ] - } - ], - "source": [ - "velocities = [velocity]\n", - "age = 0.\n", - "for i in range(steps):\n", - " v1 = field.diffuse(velocities[-1], nu, dt)\n", - " v2 = advect.semi_lagrangian(v1, v1, dt)\n", - " age += dt\n", - " velocities.append(v2)\n", - "\n", - "print(\"New velocity content at t={}: {}\".format( age, velocities[-1].values.numpy()[0:5] ))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we're actually collecting all time steps in the list `vels`. This is not necessary in general (and could consume lots of memory for long-running sims), but useful here to plot the evolution of the velocity states later on.\n", - "\n", - "The print statements print a few of the velocity entries, and already shows that something is happening in our simulation, but it's difficult to get an intuition for the behavior of the PDE just from these numbers. Hence, let's visualize the states over time to show what is happening.\n", - "\n", - "## Visualization\n", - "\n", - "We can visualize this 1D case easily in a graph: the following code shows the initial state in blue, and then times $10/32, 20/32, 1$ in green, cyan and purple. " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# we only need \"velocity.data\" from each phiflow state\n", - "#vels = [v.values.numpy('x') for v in velocities]\n", - "vels = [v.values.numpy('x,vector') for v in velocities] # vel vx\n", - "\n", - "#import matplotlib.pyplot as plt\n", - "import pylab as plt\n", - "\n", - "fig = plt.figure().gca()\n", - "fig.plot(np.linspace(-1,1,len(vels[ 0].flatten())), vels[ 0].flatten(), lw=2, color='blue')\n", - "fig.plot(np.linspace(-1,1,len(vels[10].flatten())), vels[10].flatten(), lw=2, color='green')\n", - "fig.plot(np.linspace(-1,1,len(vels[20].flatten())), vels[20].flatten(), lw=2, color='cyan')\n", - "fig.plot(np.linspace(-1,1,len(vels[32].flatten())), vels[32].flatten(), lw=2, color='purple')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This nicely shows the shock developing in the center of our domain, which forms from the collision of the two initial velocity \"bumps\", the positive one on left (moving right) and the negative one right of the center (moving left).\n", - "\n", - "As these lines can overlap quite a bit we'll also use a different visualization in the following chapters that shows the evolution over the course of all time steps in a 2D image. Our 1D domain will be shown along the Y-axis, and each point along X will represent one time step.\n", - "\n", - "The code below converts our collection of velocity states into a 2D array, repeating individual time steps 8 times to make the image a bit wider. This purely optional, of course, but makes it easier to see what's happening in our Burgers simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Vels array shape: (128, 33, 1)\n" - ] - }, - { - "ename": "TypeError", - "evalue": "show() got an unexpected keyword argument 'size'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msavez_compressed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./temp/burgers-groundtruth-solution.npz\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvels_img\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msteps\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# remove batch & channel dimension\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0mshow_state\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvels_img\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mshow_state\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morigin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'upper'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'magma'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolorbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#, ax=axes[i])\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;31m#vels_img = np.asarray( np.stack(vels), dtype=np.float32 ).transpose() # no component channel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/tf/lib/python3.8/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mshow\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 351\u001b[0m \"\"\"\n\u001b[1;32m 352\u001b[0m \u001b[0m_warn_if_gui_out_of_main_thread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 353\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_backend_mod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 354\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 355\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: show() got an unexpected keyword argument 'size'" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def show_state(a):\n", - " # we only have 33 time steps, blow up by a factor of 2^4 to make it easier to see\n", - " # (could also be done with more evaluations of network)\n", - " for i in range(4):\n", - " a = np.concatenate( [a,a] , axis=2)\n", - "\n", - " a = np.reshape( a, [a.shape[0],a.shape[1]*a.shape[2]] )\n", - " #print(\"resulting image size\" +format(a.shape))\n", - " im = plt.imshow(a, origin='upper', cmap='magma')\n", - " plt.colorbar(im) #, ax=axes[i])\n", - " #plt.show(size=(5, 5))\n", - " \n", - "#vels_img = np.asarray( np.stack(vels), dtype=np.float32 ).transpose() # no component channel\n", - "vels_img = np.asarray( np.concatenate(vels, axis=-1), dtype=np.float32 ) # vel vx\n", - "vels_img = np.reshape(vels_img, list(vels_img.shape)+[1] ) ; print(\"Vels array shape: \"+format(vels_img.shape))\n", - "\n", - "# save for comparison with reconstructions later on\n", - "np.savez_compressed(\"./temp/burgers-groundtruth-solution.npz\", np.reshape(vels_img,[n,steps+1])) # remove batch & channel dimension\n", - "\n", - "show_state(vels_img)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Next steps\n", - "\n", - "Some things to try based on this simulation setup:\n", - "\n", - "- Feel free to experiment - the setup above is very simple, you can change the simulation parameters, or the initialization. E.g., you can use a noise field via `Noise(vector=1)` to get more chaotic results.\n", - "- A bit more complicated: extend the simulation to 2D (or higher). This will require changes throughout, but all operators above support higher dimensions. Before trying this, you probably will want to check out the next example, which covers a 2D Navier-Stokes case." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/overview-burgers-forw.ipynb b/overview-burgers-forw.ipynb index f1c674c..b36d360 100644 --- a/overview-burgers-forw.ipynb +++ b/overview-burgers-forw.ipynb @@ -4,116 +4,168 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Simple forward simulation of Burgers equation\n", + "# Simple Forward Simulation of Burgers Equation with ΦFlow\n", "\n", - "how to run ...\n", - "simple model equation \n", + "This chapter will give an introduction for how to run _forward_, i.e., regular simulations starting with a given initial state and approximating a later state numerically, with ΦFlow.\n", + "\n", + "Burgers equations is a very simple, yet non-linear and non-trivial, model equation, and hence a very good starting point for experiments. It contains an advection term (motion / transport) and a diffusion term (dissipation due to the second law of thermodynamics). Burgers equation can already lead to interesting shock formations, and is given by:\n", "$\n", " \\frac{\\partial u}{\\partial{t}} + u \\nabla u =\n", " \\nu \\nabla\\cdot \\nabla u\n", "$ \n", "\n", - "Note, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (Skip or modify this command if necessary.)" + "Let's get some preliminaries out of the way: we'll import the ΦFlow library, and define our simulation domain with $n=128$ cells as discretization points for the 1D velocity $u$ in a periodic domain $\\Omega$ for the interval $[-1,1]$. We'll use 32 time `steps` for a time interval of 1, giving us `dt=1/32`. Additionally, we'll use a viscosity of $\\nu=0.01/\\pi$.\n", + "\n", + "We'll also define an initial state given by $-\\text{sin}(\\pi x)$ in the numpy array `initial`, which we'll use to initialize the velocity $u$ in the simulation in the next cell.\n", + "\n", + "**Note:** Below, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (You can skip or modify this command if necessary, depending on your system.)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Note, the velocity array has a batch dimension, and 1 channel component in this 1D case: (1, 128, 1)\n", - "\n", - "Initial velocity state: [[1.2246469e-16]\n", - " [4.9453720e-02]\n", - " [9.8786421e-02]\n", - " [1.4787737e-01]\n", - " [1.9660644e-01]] ...\n", - "\n", - "Last velocity: [[0.00552158]\n", - " [0.0165598 ]\n", - " [0.02760994]\n", - " [0.03866227]\n", - " [0.04973169]\n", - " [0.06080895]\n", - " [0.07190682]\n", - " [0.08301631]\n", - " [0.09414805]\n", - " [0.10529345]] ...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " for key in self._mapping:\n", - "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " yield (key, self._mapping[key])\n", - "/home/thuerey/phiflow/phi/viz/display.py:80: UserWarning: GUI is disabled because of missing dependencies: No module named 'imageio'. To install all dependencies, run $ pip install phiflow[gui]\n", - " warnings.warn('GUI is disabled because of missing dependencies: %s. To install all dependencies, run $ pip install phiflow[gui]' % import_error)\n" + "Using phiflow version: 2.0.0\n" ] } ], "source": [ - "!pip install --upgrade --quiet phiflow\n", + "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", + "#!pip install --upgrade --quiet phiflow\n", + "\n", "from phi.flow import *\n", - "\n", - "# run with phiflow\n", - "n = 128\n", - "steps = 32\n", - "dt = 1./steps\n", - "viscosity = 0.01/np.pi\n", - "initial = np.asarray( [ [-math.sin(np.pi * x) * 1.] for x in np.linspace(-1,1,n)] )\n", - "\n", - "domain = Domain([n], boundaries=PERIODIC, box=box[-1:1])\n", - "state = [BurgersVelocity(domain, velocity=initial, viscosity=viscosity)]\n", - "\n", - "print(\"Note, the velocity array has a batch dimension, and 1 channel component in this 1D case: \"+ format(state[0].velocity.data.shape) ) # -> (1, 128, 1)\n", - "print(\"\\nInitial velocity state: \" + format(state[0].velocity.data[0][0:5]) +\" ...\" )\n", - "\n", - "for i in range(32):\n", - "\n", - " v = state[-1].velocity\n", - " v = diffuse(v, dt * viscosity, substeps=1)\n", - " v = advect.semi_lagrangian(v, v, dt)\n", - " state.append( state[-1].copied_with(velocity=v, age=v.age + dt) )\n", - "\n", - " # here, we manually execute the different components of the PDE for clarity, \n", - " # in phiflow we could simply use the step() method of the Burgers() class:\n", - " #state.append( Burgers().step(state[-1], dt=dt) )\n", - " \n", - "print(\"\\nLast velocity: \" + format(state[-1].velocity.data[0][0:10]) +\" ...\")" + "import phi\n", + "print(\"Using phiflow version: {}\".format(phi.__version__))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "So far so good, but not so easy to evaluate. Show in graph: blue is initial state, then times $10/32, 20/32, 1$ in green, cyan and purple:" + "Now that we've loaded phiflow, we can start defining some globals and constants. The `initial` array contains the aforementioned sine wave that we'll use to produce a nice shock in the center of our domain.\n", + "\n", + "First we'll initialize some constants (denote by upper-case names):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, + "outputs": [], + "source": [ + "N = 128\n", + "STEPS = 32\n", + "DT = 1./STEPS\n", + "NU = 0.01/np.pi\n", + "\n", + "# initialization of velocities\n", + "INITIAL = np.asarray( [-np.sin(np.pi * x) * 1. for x in np.linspace(-1,1,N)] ) # 1D array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we can define the `domain` to contain $\\Omega$, as outlined above periodically for $[-1,1]$. We also initialize a 1D `velocity` from the `initial` array.\n", + "\n", + "Just to illustrate, we'll also print some info about the velocity object: it's a `phiflow.math` tensor with a size of 128. Note that the actual grid content is contained in the `values` of the grid. Below we're printing the first five entries via the conversion to a numpy array with `numpy()`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Velocity tensor shape: (x=128)\n", + "Velocity tensor type: \n", + "Velocity tensor content: [1.2246469e-16 4.9453720e-02 9.8786421e-02 1.4787737e-01 1.9660644e-01]\n" + ] + } + ], + "source": [ + "DOMAIN = Domain(x=N, boundaries=PERIODIC, bounds=Box[-1:1])\n", + "velocity = DOMAIN.scalar_grid(INITIAL)\n", + "#velocity = DOMAIN.grid(Noise(vector=1)) # random init instead of sine curve\n", + "\n", + "print(\"Velocity tensor shape: \" + format( velocity.shape )) # == velocity.values.shape\n", + "print(\"Velocity tensor type: \" + format( type(velocity.values) ))\n", + "print(\"Velocity tensor content: \" + format( velocity.values.numpy()[0:5] ))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the simulation\n", + "\n", + "Now we're ready to run the simulation itself. To compute the diffusion and advection components of our model equation we can simply call the existing `diffusion` and `semi_lagrangian` operators in phiflow:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "New velocity content at t=1.0: [0.00274862 0.01272991 0.02360343 0.03478042 0.0460869 ]\n" + ] + } + ], + "source": [ + "velocities = [velocity]\n", + "age = 0.\n", + "for i in range(STEPS):\n", + " v1 = diffuse.explicit(velocities[-1], NU, DT)\n", + " v2 = advect.semi_lagrangian(v1, v1, DT)\n", + " age += DT\n", + " velocities.append(v2)\n", + "\n", + "print(\"New velocity content at t={}: {}\".format( age, velocities[-1].values.numpy()[0:5] ))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we're actually collecting all time steps in the list `vels`. This is not necessary in general (and could consume lots of memory for long-running sims), but useful here to plot the evolution of the velocity states later on.\n", + "\n", + "The print statements print a few of the velocity entries, and already shows that something is happening in our simulation, but it's difficult to get an intuition for the behavior of the PDE just from these numbers. Hence, let's visualize the states over time to show what is happening.\n", + "\n", + "## Visualization\n", + "\n", + "We can visualize this 1D case easily in a graph: the following code shows the initial state in blue, and then times $10/32, 20/32, 1$ in green, cyan and purple. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 2, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -126,14 +178,12 @@ ], "source": [ "# we only need \"velocity.data\" from each phiflow state\n", - "vels = [x.velocity.data for x in state]\n", + "#vels = [v.values.numpy('x') for v in velocities]\n", + "vels = [v.values.numpy('x,vector') for v in velocities] # vel vx\n", "\n", - "# print(vels[0][0,:,0].shape)\n", - "# print(vels[0].shape[1])\n", + "import pylab\n", "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "fig = plt.figure().gca()\n", + "fig = pylab.figure().gca()\n", "fig.plot(np.linspace(-1,1,len(vels[ 0].flatten())), vels[ 0].flatten(), lw=2, color='blue')\n", "fig.plot(np.linspace(-1,1,len(vels[10].flatten())), vels[10].flatten(), lw=2, color='green')\n", "fig.plot(np.linspace(-1,1,len(vels[20].flatten())), vels[20].flatten(), lw=2, color='cyan')\n", @@ -144,26 +194,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "And as image..." + "This nicely shows the shock developing in the center of our domain, which forms from the collision of the two initial velocity \"bumps\", the positive one on left (moving right) and the negative one right of the center (moving left).\n", + "\n", + "As these lines can overlap quite a bit we'll also use a different visualization in the following chapters that shows the evolution over the course of all time steps in a 2D image. Our 1D domain will be shown along the Y-axis, and each point along X will represent one time step.\n", + "\n", + "The code below converts our collection of velocity states into a 2D array, repeating individual time steps 8 times to make the image a bit wider. This purely optional, of course, but makes it easier to see what's happening in our Burgers simulation." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Vels array shape: (1, 128, 33, 1)\n" + "Vels array shape: (128, 33, 1)\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -177,21 +231,36 @@ " # we only have 33 time steps, blow up by a factor of 2^4 to make it easier to see\n", " # (could also be done with more evaluations of network)\n", " for i in range(4):\n", - " a = np.concatenate( [a,a] , axis=3)\n", + " a = np.concatenate( [a,a] , axis=2)\n", "\n", - " a = np.reshape( a, [a.shape[1],a.shape[2]*a.shape[3]] )\n", + " a = np.reshape( a, [a.shape[0],a.shape[1]*a.shape[2]] )\n", " #print(\"resulting image size\" +format(a.shape))\n", - " plt.imshow(a, origin='upper', cmap='magma')\n", - " \n", - "vels_img = np.asarray( np.concatenate(vels, axis=-1), dtype=np.float32 )\n", + " fig, axes = pylab.subplots(1, 1, figsize=(16, 5))\n", + " im = axes.imshow(a, origin='upper', cmap='inferno')\n", + " pylab.colorbar(im) \n", + " \n", + "#vels_img = np.asarray( np.stack(vels), dtype=np.float32 ).transpose() # no component channel\n", + "vels_img = np.asarray( np.concatenate(vels, axis=-1), dtype=np.float32 ) # vel vx\n", "vels_img = np.reshape(vels_img, list(vels_img.shape)+[1] ) ; print(\"Vels array shape: \"+format(vels_img.shape))\n", "\n", "# save for comparison with reconstructions later on\n", - "np.savez_compressed(\"./temp/burgers-groundtruth-solution.npz\", np.reshape(vels_img,[n,steps+1])) # remove batch & channel dimension\n", + "np.savez_compressed(\"./temp/burgers-groundtruth-solution.npz\", np.reshape(vels_img,[N,STEPS+1])) # remove batch & channel dimension\n", "\n", "show_state(vels_img)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next steps\n", + "\n", + "Some things to try based on this simulation setup:\n", + "\n", + "- Feel free to experiment - the setup above is very simple, you can change the simulation parameters, or the initialization. E.g., you can use a noise field via `Noise(vector=1)` to get more chaotic results.\n", + "- A bit more complicated: extend the simulation to 2D (or higher). This will require changes throughout, but all operators above support higher dimensions. Before trying this, you probably will want to check out the next example, which covers a 2D Navier-Stokes case." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/overview-equations.md b/overview-equations.md index e4f6b5c..8de874b 100644 --- a/overview-equations.md +++ b/overview-equations.md @@ -7,10 +7,18 @@ In addition we'll discuss some _model equations_ below. Note that we won't use _ ## Deep Learning and Neural Networks There are lots of great introductions to deep learning - hence, we'll keep it short: -our goal is to approximate $f^*(x)=y$ with an NN $f(x;\theta)$, -given some formulation for an error $e(y,y^*)$ with $y=f(x;\theta)$ being the output -of the NN, and $y^*$ denoting a reference or ground truth value. +our goal is to approximate an unknown function + +$f^*(x) = y^*$ , + +where $y^*$ denotes reference or "ground truth" solutions. +$f^*(x)$ should be approximated with an NN representation $f(x;\theta)$. We typically determine $f$ +with the help of some formulation of an error function $e(y,y^*)$, where $y=f(x;\theta)$ is the output +of the NN. This gives a minimization problem to find $f(x;\theta)$ such that $e$ is minimized. +In the simplest case, we can use an $L^2$ error, giving + +$\text{min}_{\theta} || f(x;\theta) - y^* ||_2^2$ We typically optimize, i.e. _train_, with some variant of a stochastic gradient descent (SGD) optimizer. @@ -177,7 +185,7 @@ $\begin{aligned} \text{subject to} \quad \nabla \cdot \mathbf{u} &= 0 \end{aligned}$ -where, like before, $\nu$ denotes a diffusion constant for viscosity, respectively. +where, like before, $\nu$ denotes a diffusion constant for viscosity. An interesting variant is obtained by including the Boussinesq approximation for varying densities, e.g., for simple temperature changes of the fluid. @@ -187,13 +195,14 @@ this yields the following set of equations: $\begin{aligned} \frac{\partial u_x}{\partial{t}} + \mathbf{u} \cdot \nabla u_x &= - \frac{1}{\rho} \nabla p \\ - \frac{\partial u_y}{\partial{t}} + \mathbf{u} \cdot \nabla u_y &= - \frac{1}{\rho} \nabla p + \eta d + \frac{\partial u_y}{\partial{t}} + \mathbf{u} \cdot \nabla u_y &= - \frac{1}{\rho} \nabla p + \xi d \\ \text{subject to} \quad \nabla \cdot \mathbf{u} &= 0, \\ \frac{\partial d}{\partial{t}} + \mathbf{u} \cdot \nabla d &= 0 \end{aligned}$ +where $\xi$ denotes the strength of the buoyancy force. And finally, we'll also consider 3D cases with the Navier-Stokes model, i.e.: diff --git a/overview-ns-forw-v1.ipynb b/overview-ns-forw-v1.ipynb new file mode 100644 index 0000000..5ba9cb3 --- /dev/null +++ b/overview-ns-forw-v1.ipynb @@ -0,0 +1,381 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "o4JZ84moBKMr" + }, + "source": [ + "# Navier-Stokes Forward Simulation with ΦFlow\n", + "\n", + "... now a more complex example with fluid simulations (Navier-Stokes) ... still very simple with phiflow (complexity of the differentiable operators hidden).\n", + "\n", + "As before, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (Skip or modify this command if necessary.)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "da1uZcDXdVcF", + "outputId": "1082dc87-796c-4b57-e72e-5790fc1444c9" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", + " for key in self._mapping:\n", + "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", + " yield (key, self._mapping[key])\n", + "/home/thuerey/phiflow/phi/viz/display.py:80: UserWarning: GUI is disabled because of missing dependencies: No module named 'imageio'. To install all dependencies, run $ pip install phiflow[gui]\n", + " warnings.warn('GUI is disabled because of missing dependencies: %s. To install all dependencies, run $ pip install phiflow[gui]' % import_error)\n" + ] + } + ], + "source": [ + "!pip install --upgrade --quiet phiflow\n", + "from phi.flow import * # The Dash GUI is not supported on Google Colab, ignore the warning\n", + "import pylab" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BVV1IKVqDfLl" + }, + "source": [ + "## Setting up the simulation\n", + "\n", + "ΦFlow is object-oriented, i.e. you assemble your simulation by constructing a number of objects and adding them to the world.\n", + "\n", + "The following code sets up four fluid simulations that run in parallel (`batch_size=4`). Each fluid simulation has a circular Inflow at a different location." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "WrA3IXDxv31P" + }, + "outputs": [], + "source": [ + "world = World()\n", + "fluid = world.add(Fluid(Domain([40, 32], boundaries=CLOSED), buoyancy_factor=0.05), physics=IncompressibleFlow())\n", + "world.add(Inflow(Sphere(center=[5,14], radius=3), rate=0.2));" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ExA0Pi2sFVka" + }, + "source": [ + "The inflow affects the fluid's marker density. Because a Boussinesq model with a positive `buoyancy_factor` is active, the marker field `density` creates an upward force. Note that this density is not the density of the fluid, but the amount of marker quantity present in each cell.\n", + "\n", + "Let's plot the marker density after one simulation frame." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "WmGZdOwswOva", + "outputId": "3ae4d68d-b586-4bbe-eca9-a223d7720949" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "world.step()\n", + "pylab.imshow(fluid.density.data[0,...,0], origin='lower', cmap='magma')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A lot has happened internally in the `world.step()` call, e.g., for fluids we have a more complex `struct` object that stores the different fields of the simulation. For fluids we have the aforementioned marker density in addition to a velocity." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fluid state: Fluid[density: Grid[40x32(1), size=[40. 32.], float32], velocity: StaggeredGrid[40x32, size=[40. 32.], float32]]\n", + "\n", + " Velocity content:\n", + "(1, 41, 32, 1)\n", + "(1, 40, 33, 1)\n" + ] + } + ], + "source": [ + "print(\"Fluid state: \" + format(fluid.state))\n", + "print(\"\\nVelocity content:\")\n", + "[print(grid.data.shape) for grid in fluid.velocity.unstack()];" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that we actually created two variables, one for each velocity component. If you're interested in how this works, have a look at the [Struct documentation](https://github.com/tum-pbs/PhiFlow/blob/master/documentation/Structs.ipynb).\n", + "\n", + "If you look closely at the output from the last `print` command, you'll notice that the shapes of the variables differ. This is because the velocity is sampled in [staggered form](https://github.com/tum-pbs/PhiFlow/blob/master/documentation/Staggered_Grids.md).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PA-2tGuWGHv2" + }, + "source": [ + "We can run more steps by repeatedly calling `world.step()`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0hZk5HX3w4Or", + "outputId": "f7811af7-4b58-4ff6-a8b6-6e7bedefaa6e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing frame 0\n", + "Computing frame 1\n", + "Computing frame 2\n", + "Computing frame 3\n", + "Computing frame 4\n", + "Computing frame 5\n", + "Computing frame 6\n", + "Computing frame 7\n", + "Computing frame 8\n", + "Computing frame 9\n" + ] + } + ], + "source": [ + "for frame in range(10):\n", + " print('Computing frame %d' % frame)\n", + " world.step(dt=1.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GMKKWQBLHIwP" + }, + "source": [ + "Now the hot plume is starting to rise:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "Mfl80CjZxZcL", + "outputId": "92f3a9ba-d403-4799-a543-132ee8ed234c" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pylab.imshow(fluid.density.data[0,...,0], origin='lower', cmap='magma')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wnbQJvA-HPSL" + }, + "source": [ + "Let's compute and show a few more steps of the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 489 + }, + "id": "tkhCOzc0ITsj", + "outputId": "f6366c12-1eb5-4ff6-e0d7-94b806bfd8e4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing frame 0\n", + "Computing frame 1\n", + "Computing frame 2\n", + "Computing frame 3\n", + "Computing frame 4\n", + "Computing frame 5\n", + "Computing frame 6\n", + "Computing frame 7\n", + "Computing frame 8\n", + "Computing frame 9\n", + "Computing frame 10\n", + "Computing frame 11\n", + "Computing frame 12\n", + "Computing frame 13\n", + "Computing frame 14\n", + "Computing frame 15\n", + "Computing frame 16\n", + "Computing frame 17\n", + "Computing frame 18\n", + "Computing frame 19\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "frames = [fluid.density.data[0,...,0]]\n", + "for frame in range(20):\n", + " print('Computing frame %d' % frame)\n", + " world.step(dt=1.5)\n", + " if frame%5==0:\n", + " frames.append(fluid.density.data[0,...,0])\n", + "\n", + "pylab.imshow(np.concatenate(frames,axis=1), origin='lower', cmap='magma')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ooqVxCPM8PXl" + }, + "source": [ + "It looks simple here, but this is a powerful tool. The simulation could easily be extended to more complex cases or 3D, and they're fully compatible with back-propagation pipelines of deep learning frameworks. \n", + "\n", + "In the next chapters we'll show how to use these simulations for training NNs, and how to steer and modify them via trained NNs. This will illustrate how much we can improve the training process by having a solver in the loop, and especially by having differentiable solvers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BL-AOqwMJmkq" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "Forw Simulations with Φ-Flow.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/overview-ns-forw-v2.ipynb b/overview-ns-forw-v2.ipynb deleted file mode 100644 index 9e45afc..0000000 --- a/overview-ns-forw-v2.ipynb +++ /dev/null @@ -1,451 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "o4JZ84moBKMr" - }, - "source": [ - "# Navier-Stokes Forward Simulation\n", - "\n", - "Now let's target a somewhat more complex example: a fluid simulations based on the Navier-Stokes equations. This is still very simple with ΦFlow, as differentiable operators for all steps exist. The Navier-Stokes equations (in their incompressible form) introduce an additional pressure field $p$, and a constraint for conservation of mass:\n", - "\n", - "$\\begin{align}\n", - " \\frac{\\partial \\mathbf{u}}{\\partial{t}} + \\mathbf{u} \\nabla \\mathbf{u} &= - \\frac{dt}{\\rho} \\nabla p + \\nu \\nabla\\cdot \\nabla \\mathbf{u} + \\mathbf{g} \\\\\n", - " \\nabla \\cdot \\mathbf{u} &= 0 \n", - "\\end{align}$ \n", - "\n", - "Here $\\mathbf{g}$ collects the forcing terms. Below we'll use a simple buoyancy model. We'll solve this PDE on a closed domain with Dirchlet boundary conditions $\\mathbf{u}=0$ for the velocity, and Neumann boundaries $\\frac{\\partial p}{\\partial x}=0$ for pressure, on a domain $\\Omega$ with a physical size of $100 \\times 80$ units. \n", - "\n", - "## Implementation\n", - "\n", - "As before, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (Skip or modify this command if necessary.)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "da1uZcDXdVcF", - "outputId": "1082dc87-796c-4b57-e72e-5790fc1444c9" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/thuerey/miniconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " for key in self._mapping:\n", - "/Users/thuerey/miniconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " yield (key, self._mapping[key])\n" - ] - } - ], - "source": [ - "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", - "# [ !pip install --upgrade --quiet phiflow ]\n", - "from phi.flow import * # The Dash GUI is not supported on Google Colab, ignore the warning\n", - "import pylab" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "BVV1IKVqDfLl" - }, - "source": [ - "## Setting up the simulation\n", - "\n", - "ΦFlow is object-oriented and centered around field data in the form of grids (internally represented by a tensor object). I.e. you assemble your simulation by constructing a number of grids, and updating them over the course of time steps.\n", - "\n", - "The following code sets up a simulation domain with the physical size, an inflow object to emit a smoke density, and three field: a staggerend `velocity` grid, and two centered grids for the smoke density and a pressure field. We'll use $40\\times32$ cells to discretize our domain, introduce a slight viscosity via $\\nu$, and define the time step to be $\\Delta t=1.5$. \n", - "(As the following variables are constants, they have upper case names.)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "id": "WrA3IXDxv31P" - }, - "outputs": [], - "source": [ - "DOMAIN = Domain(x=40, y=32, boundaries=CLOSED, bounds=Box[0:100, 0:80])\n", - "INFLOW = DOMAIN.grid(Sphere(center=(30, 15), radius=10)) * 0.2\n", - "\n", - "DT = 1.5\n", - "NU = 0.01" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ExA0Pi2sFVka" - }, - "source": [ - "The inflow will be used to inject smoke into the `smoke` grid. Note that we've defined a `Box` of size $100x80$ above. This is the physical scale in terms of spatial units in our simulation, i.e., a velocity of magnitude $1$ will move the smoke density by 1 unit per 1 time unit, which may be larger or smaller than a cell in the discretized grid, depending on the settings for `x,y`. You could parametrize your simulation grid to directly resemble real-world units, or keep conversion factors in mind for conversion. \n", - "\n", - "The inflow sphere above is already using the \"world\" coordinates: it is located at $x=30$ along the first axis, and $y=15$ (within the $100x80$ domain box).\n", - "\n", - "Next, we create grids for the quantities we want to simulate. For this example, we require a velocity field and a smoke density field.\n", - "We sample the smoke field at the cell centers and the velocity in [staggered form](https://tum-pbs.github.io/PhiFlow/Staggered_Grids.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# velocity = domain.staggered_grid(0) # alternatively vector_grid(0)\n", - "# smoke = pressure = divergence = domain.grid(0)\n", - "\n", - "smoke = DOMAIN.scalar_grid(0) # sampled at cell centers\n", - "velocity = DOMAIN.staggered_grid(0) # sampled in staggered form at face centers " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's define the update step, and plot the marker density after one simulation frame." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 282 - }, - "id": "WmGZdOwswOva", - "outputId": "3ae4d68d-b586-4bbe-eca9-a223d7720949" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max. velocity and mean density: [0.135354, 0.007865495]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def step(velocity, smoke, pressure, dt=1.0, buoyancy_factor=1.0):\n", - " smoke = advect.semi_lagrangian(smoke, velocity, dt) + INFLOW\n", - " buoyancy_force = smoke * (0, buoyancy_factor) >> velocity # resamples smoke to velocity sample points\n", - " velocity = advect.semi_lagrangian(velocity, velocity, 1) + dt * buoyancy_force\n", - " velocity = diffuse.explicit(velocity, NU, dt)\n", - " velocity, pressure, iterations, divergence = fluid.make_incompressible(velocity, DOMAIN, pressure_guess=pressure)\n", - " return velocity, smoke, pressure\n", - "\n", - "velocity, smoke, pressure = step(velocity, smoke, None, dt=DT)\n", - "\n", - "print(\"Max. velocity and mean density: \" + format( [ math.max(velocity.values) , math.mean(smoke.values) ] ))\n", - "\n", - "pylab.imshow(np.asarray(smoke.values.numpy('y,x')), origin='lower', cmap='magma')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A lot has happened in this `step()` call: we've advected the smoke field, added an upwards force via a Boussinesq model, advected the velocity field, and finally made it divergence free via a pressure solve.\n", - "\n", - "The Boussinesq model uses a multiplication by a tuple `(0, buoyancy_factor)` to turn the smoke field into a 2 component force field, sampled at the staggered velocity components via the `>>` operator. \n", - "\n", - "The pressure projection step in `make_incompressible` is typically the computationally most expensive step in the sequence above. It solves a Poisson equation for the boundary conditions of the domain, and updates the velocity field with the gradient of the computed pressure.\n", - "\n", - "Just for testing, we've also printed the mean value of the velocities, and the max density after the update. As you can see in the resulting image, we have a first round region of smoke, with a slight upwards motion (which does not show here yet). \n", - "\n", - "## Datatypes and Dimensions\n", - "\n", - "The created grids are instances of the class `Grid`.\n", - "Like tensors, grids also have the `shape` attribute which lists all batch, spatial and channel dimensions.\n", - "[Shapes in ΦFlow](https://tum-pbs.github.io/PhiFlow/Math.html#shapes) store not only the sizes of the dimensions but also their names and types." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Smoke: (x=40, y=32)\n", - "Velocity: (x=40, y=32, vector=2)\n", - "Inflow: (x=40, y=32)\n", - "Inflow, spatial only: (x=40, y=32)\n" - ] - } - ], - "source": [ - "print(f\"Smoke: {smoke.shape}\")\n", - "print(f\"Velocity: {velocity.shape}\")\n", - "print(f\"Inflow: {INFLOW.shape}\")\n", - "print(f\"Inflow, spatial only: {INFLOW.shape.spatial}\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The grid values can be accessed using the `values` property." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(x=40, y=32) float32 0.0 < ... < 0.2\n", - "(x=(41, 40) along vector, y=(32, 33) along vector, vector=2) float32 -0.10927753 < ... < 0.135354\n", - "(x=40, y=32) float32 0.0 < ... < 0.2\n" - ] - } - ], - "source": [ - "print(smoke.values)\n", - "print(velocity.values)\n", - "print(INFLOW.values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Grids have many more properties which are documented [here](https://tum-pbs.github.io/PhiFlow/phi/field/#phi.field.Grid).\n", - "Also note that the staggered grid has a [non-uniform shape](https://tum-pbs.github.io/PhiFlow/Math.html#non-uniform-tensors) because the number of faces is not equal to the number of cells. The `INFLOW` grid naturally has the same dimensions as the `smoke` grid.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Time Evolution\n", - "\n", - "With this setup, we can easily advance the simulation forward in time a bit more by repeatedly calling the `step` function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "0hZk5HX3w4Or", - "outputId": "f7811af7-4b58-4ff6-a8b6-6e7bedefaa6e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Computed frame 0, max velocity 0.40485728\n", - "Computed frame 1, max velocity 0.80262446\n", - "Computed frame 2, max velocity 1.3215623\n", - "Computed frame 3, max velocity 1.99783\n", - "Computed frame 4, max velocity 2.8307805\n", - "Computed frame 5, max velocity 3.756278\n", - "Computed frame 6, max velocity 4.5489845\n", - "Computed frame 7, max velocity 5.147038\n", - "Computed frame 8, max velocity 5.5985193\n", - "Computed frame 9, max velocity 6.0121617\n" - ] - } - ], - "source": [ - "for time_step in range(10):\n", - " velocity, smoke, pressure = step(velocity, smoke, pressure, dt=DT)\n", - " print('Computed frame {}, max velocity {}'.format(time_step , np.asarray(math.max(velocity.values)) ))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GMKKWQBLHIwP" - }, - "source": [ - "Now the hot plume is starting to rise:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 282 - }, - "id": "Mfl80CjZxZcL", - "outputId": "92f3a9ba-d403-4799-a543-132ee8ed234c" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "pylab.imshow(smoke.values.numpy('y,x'), origin='lower', cmap='magma')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wnbQJvA-HPSL" - }, - "source": [ - "Let's compute and show a few more steps of the simulation. Because of the inflow being located off-center to the left (with x position 30), the plume will curve towards the right when it hits the top wall of the domain." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 489 - }, - "id": "tkhCOzc0ITsj", - "outputId": "f6366c12-1eb5-4ff6-e0d7-94b806bfd8e4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Computing time step 0\n", - "Computing time step 1\n", - "Computing time step 2\n", - "Computing time step 10\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "steps = [smoke.values.numpy('y,x')]\n", - "for time_step in range(20):\n", - " if time_step<3 or time_step%10==0: \n", - " print('Computing time step %d' % time_step)\n", - " velocity, smoke, pressure = step(velocity, smoke, pressure, dt=DT)\n", - " if time_step%5==0:\n", - " steps.append(smoke.values.numpy('y,x'))\n", - "\n", - "fig, axes = pylab.subplots(1, len(steps), figsize=(16, 5))\n", - "for i in range(len(steps)):\n", - " axes[i].imshow(steps[i], origin='lower', cmap='magma')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ooqVxCPM8PXl" - }, - "source": [ - "It looks simple here, but this simulation setup is a powerful tool. The simulation could easily be extended to more complex cases or 3D, and they're fully compatible with back-propagation pipelines of deep learning frameworks. \n", - "\n", - "In the next chapters we'll show how to use these simulations for training NNs, and how to steer and modify them via trained NNs. This will illustrate how much we can improve the training process by having a solver in the loop, and especially by having differentiable solvers." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "BL-AOqwMJmkq" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "name": "Forw Simulations with Φ-Flow.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/overview-ns-forw.ipynb b/overview-ns-forw.ipynb index 5ba9cb3..76d7b12 100644 --- a/overview-ns-forw.ipynb +++ b/overview-ns-forw.ipynb @@ -6,9 +6,21 @@ "id": "o4JZ84moBKMr" }, "source": [ - "# Navier-Stokes Forward Simulation with ΦFlow\n", + "# Navier-Stokes Forward Simulation\n", "\n", - "... now a more complex example with fluid simulations (Navier-Stokes) ... still very simple with phiflow (complexity of the differentiable operators hidden).\n", + "Now let's target a somewhat more complex example: a fluid simulations based on the Navier-Stokes equations. This is still very simple with ΦFlow, as differentiable operators for all steps exist. The Navier-Stokes equations (in their incompressible form) introduce an additional pressure field $p$, and a constraint for conservation of mass. We're also moving a marker quantity $d$ with the flow, that indicates regions of higher temperature with a bouyance model via the parameter $\\xi$:\n", + "\n", + "$\\begin{aligned}\n", + " \\frac{\\partial \\mathbf{u}}{\\partial{t}} + \\mathbf{u} \\cdot \\nabla \\mathbf{u} &= - \\frac{\\Delta t}{\\rho} \\nabla p + \\nu \\nabla\\cdot \\nabla \\mathbf{u} + (0,1)^T \\xi d\n", + " \\quad \\text{s.t.} \\quad \\nabla \\cdot \\mathbf{u} = 0,\n", + " \\\\\n", + " \\frac{\\partial d}{\\partial{t}} + \\mathbf{u} \\cdot \\nabla d &= 0 \n", + "\\end{aligned}$\n", + "\n", + "\n", + "Here $\\mathbf{g}$ collects the forcing terms. Below we'll use a simple buoyancy model. We'll solve this PDE on a closed domain with Dirchlet boundary conditions $\\mathbf{u}=0$ for the velocity, and Neumann boundaries $\\frac{\\partial p}{\\partial x}=0$ for pressure, on a domain $\\Omega$ with a physical size of $100 \\times 80$ units. \n", + "\n", + "## Implementation\n", "\n", "As before, the first command with a \"!\" prefix installs the [ΦFlow Python package from GitHub](https://github.com/tum-pbs/PhiFlow) via `pip` in your python environment. (Skip or modify this command if necessary.)" ] @@ -28,17 +40,16 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", + "/Users/thuerey/miniconda3/envs/tf/lib/python3.8/_collections_abc.py:743: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", " for key in self._mapping:\n", - "/home/thuerey/anaconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", - " yield (key, self._mapping[key])\n", - "/home/thuerey/phiflow/phi/viz/display.py:80: UserWarning: GUI is disabled because of missing dependencies: No module named 'imageio'. To install all dependencies, run $ pip install phiflow[gui]\n", - " warnings.warn('GUI is disabled because of missing dependencies: %s. To install all dependencies, run $ pip install phiflow[gui]' % import_error)\n" + "/Users/thuerey/miniconda3/envs/tf/lib/python3.8/_collections_abc.py:744: MatplotlibDeprecationWarning: The global colormaps dictionary is no longer considered public API.\n", + " yield (key, self._mapping[key])\n" ] } ], "source": [ - "!pip install --upgrade --quiet phiflow\n", + "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", + "#!pip install --upgrade --quiet phiflow \n", "from phi.flow import * # The Dash GUI is not supported on Google Colab, ignore the warning\n", "import pylab" ] @@ -51,9 +62,10 @@ "source": [ "## Setting up the simulation\n", "\n", - "ΦFlow is object-oriented, i.e. you assemble your simulation by constructing a number of objects and adding them to the world.\n", + "ΦFlow is object-oriented and centered around field data in the form of grids (internally represented by a tensor object). I.e. you assemble your simulation by constructing a number of grids, and updating them over the course of time steps.\n", "\n", - "The following code sets up four fluid simulations that run in parallel (`batch_size=4`). Each fluid simulation has a circular Inflow at a different location." + "The following code sets up a simulation domain with the physical size, an inflow object to emit a smoke density, and three field: a staggerend `velocity` grid, and two centered grids for the smoke density and a pressure field. We'll use $40\\times32$ cells to discretize our domain, introduce a slight viscosity via $\\nu$, and define the time step to be $\\Delta t=1.5$. \n", + "(As the following variables are constants, they have upper case names.)" ] }, { @@ -64,9 +76,11 @@ }, "outputs": [], "source": [ - "world = World()\n", - "fluid = world.add(Fluid(Domain([40, 32], boundaries=CLOSED), buoyancy_factor=0.05), physics=IncompressibleFlow())\n", - "world.add(Inflow(Sphere(center=[5,14], radius=3), rate=0.2));" + "DOMAIN = Domain(x=40, y=32, boundaries=CLOSED, bounds=Box[0:100, 0:80])\n", + "INFLOW = DOMAIN.grid(Sphere(center=(30, 15), radius=10)) * 0.2\n", + "\n", + "DT = 1.5\n", + "NU = 0.01" ] }, { @@ -75,14 +89,37 @@ "id": "ExA0Pi2sFVka" }, "source": [ - "The inflow affects the fluid's marker density. Because a Boussinesq model with a positive `buoyancy_factor` is active, the marker field `density` creates an upward force. Note that this density is not the density of the fluid, but the amount of marker quantity present in each cell.\n", + "The inflow will be used to inject smoke into the `smoke` grid to represent the marker field $d$ from above. Note that we've defined a `Box` of size $100x80$ above. This is the physical scale in terms of spatial units in our simulation, i.e., a velocity of magnitude $1$ will move the smoke density by 1 unit per 1 time unit, which may be larger or smaller than a cell in the discretized grid, depending on the settings for `x,y`. You could parametrize your simulation grid to directly resemble real-world units, or keep conversion factors in mind for conversion. \n", "\n", - "Let's plot the marker density after one simulation frame." + "The inflow sphere above is already using the \"world\" coordinates: it is located at $x=30$ along the first axis, and $y=15$ (within the $100x80$ domain box).\n", + "\n", + "Next, we create grids for the quantities we want to simulate. For this example, we require a velocity field and a smoke density field.\n", + "We sample the smoke field at the cell centers and the velocity in [staggered form](https://tum-pbs.github.io/PhiFlow/Staggered_Grids.html)." ] }, { "cell_type": "code", "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# velocity = domain.staggered_grid(0) # alternatively vector_grid(0)\n", + "# smoke = pressure = divergence = domain.grid(0)\n", + "\n", + "smoke = DOMAIN.scalar_grid(0) # sampled at cell centers\n", + "velocity = DOMAIN.staggered_grid(0) # sampled in staggered form at face centers " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's define the update step, and plot the marker density after one simulation frame." + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -92,19 +129,26 @@ "outputId": "3ae4d68d-b586-4bbe-eca9-a223d7720949" }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max. velocity and mean density: [0.135354, 0.007865495]\n" + ] + }, { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -116,61 +160,113 @@ } ], "source": [ - "world.step()\n", - "pylab.imshow(fluid.density.data[0,...,0], origin='lower', cmap='magma')" + "def step(velocity, smoke, pressure, dt=1.0, buoyancy_factor=1.0):\n", + " smoke = advect.semi_lagrangian(smoke, velocity, dt) + INFLOW\n", + " buoyancy_force = smoke * (0, buoyancy_factor) >> velocity # resamples smoke to velocity sample points\n", + " velocity = advect.semi_lagrangian(velocity, velocity, 1) + dt * buoyancy_force\n", + " velocity = diffuse.explicit(velocity, NU, dt)\n", + " velocity, pressure, iterations, divergence = fluid.make_incompressible(velocity, DOMAIN, pressure_guess=pressure)\n", + " return velocity, smoke, pressure\n", + "\n", + "velocity, smoke, pressure = step(velocity, smoke, None, dt=DT)\n", + "\n", + "print(\"Max. velocity and mean density: \" + format( [ math.max(velocity.values) , math.mean(smoke.values) ] ))\n", + "\n", + "pylab.imshow(np.asarray(smoke.values.numpy('y,x')), origin='lower', cmap='magma')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "A lot has happened internally in the `world.step()` call, e.g., for fluids we have a more complex `struct` object that stores the different fields of the simulation. For fluids we have the aforementioned marker density in addition to a velocity." + "A lot has happened in this `step()` call: we've advected the smoke field, added an upwards force via a Boussinesq model, advected the velocity field, and finally made it divergence free via a pressure solve.\n", + "\n", + "The Boussinesq model uses a multiplication by a tuple `(0, buoyancy_factor)` to turn the smoke field into a 2 component force field, sampled at the staggered velocity components via the `>>` operator. \n", + "\n", + "The pressure projection step in `make_incompressible` is typically the computationally most expensive step in the sequence above. It solves a Poisson equation for the boundary conditions of the domain, and updates the velocity field with the gradient of the computed pressure.\n", + "\n", + "Just for testing, we've also printed the mean value of the velocities, and the max density after the update. As you can see in the resulting image, we have a first round region of smoke, with a slight upwards motion (which does not show here yet). \n", + "\n", + "## Datatypes and Dimensions\n", + "\n", + "The created grids are instances of the class `Grid`.\n", + "Like tensors, grids also have the `shape` attribute which lists all batch, spatial and channel dimensions.\n", + "[Shapes in ΦFlow](https://tum-pbs.github.io/PhiFlow/Math.html#shapes) store not only the sizes of the dimensions but also their names and types." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Fluid state: Fluid[density: Grid[40x32(1), size=[40. 32.], float32], velocity: StaggeredGrid[40x32, size=[40. 32.], float32]]\n", - "\n", - " Velocity content:\n", - "(1, 41, 32, 1)\n", - "(1, 40, 33, 1)\n" + "Smoke: (x=40, y=32)\n", + "Velocity: (x=40, y=32, vector=2)\n", + "Inflow: (x=40, y=32)\n", + "Inflow, spatial only: (x=40, y=32)\n" ] } ], "source": [ - "print(\"Fluid state: \" + format(fluid.state))\n", - "print(\"\\nVelocity content:\")\n", - "[print(grid.data.shape) for grid in fluid.velocity.unstack()];" + "print(f\"Smoke: {smoke.shape}\")\n", + "print(f\"Velocity: {velocity.shape}\")\n", + "print(f\"Inflow: {INFLOW.shape}\")\n", + "print(f\"Inflow, spatial only: {INFLOW.shape.spatial}\")\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Note that we actually created two variables, one for each velocity component. If you're interested in how this works, have a look at the [Struct documentation](https://github.com/tum-pbs/PhiFlow/blob/master/documentation/Structs.ipynb).\n", - "\n", - "If you look closely at the output from the last `print` command, you'll notice that the shapes of the variables differ. This is because the velocity is sampled in [staggered form](https://github.com/tum-pbs/PhiFlow/blob/master/documentation/Staggered_Grids.md).\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PA-2tGuWGHv2" - }, - "source": [ - "We can run more steps by repeatedly calling `world.step()`." + "The grid values can be accessed using the `values` property." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x=40, y=32) float32 0.0 < ... < 0.2\n", + "(x=(41, 40) along vector, y=(32, 33) along vector, vector=2) float32 -0.10927753 < ... < 0.135354\n", + "(x=40, y=32) float32 0.0 < ... < 0.2\n" + ] + } + ], + "source": [ + "print(smoke.values)\n", + "print(velocity.values)\n", + "print(INFLOW.values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Grids have many more properties which are documented [here](https://tum-pbs.github.io/PhiFlow/phi/field/#phi.field.Grid).\n", + "Also note that the staggered grid has a [non-uniform shape](https://tum-pbs.github.io/PhiFlow/Math.html#non-uniform-tensors) because the number of faces is not equal to the number of cells. The `INFLOW` grid naturally has the same dimensions as the `smoke` grid.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time Evolution\n", + "\n", + "With this setup, we can easily advance the simulation forward in time a bit more by repeatedly calling the `step` function." + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -183,23 +279,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "Computing frame 0\n", - "Computing frame 1\n", - "Computing frame 2\n", - "Computing frame 3\n", - "Computing frame 4\n", - "Computing frame 5\n", - "Computing frame 6\n", - "Computing frame 7\n", - "Computing frame 8\n", - "Computing frame 9\n" + "Computed frame 0, max velocity 0.40485728\n", + "Computed frame 1, max velocity 0.80262446\n", + "Computed frame 2, max velocity 1.3215623\n", + "Computed frame 3, max velocity 1.99783\n", + "Computed frame 4, max velocity 2.8307805\n", + "Computed frame 5, max velocity 3.756278\n", + "Computed frame 6, max velocity 4.5489845\n", + "Computed frame 7, max velocity 5.147038\n", + "Computed frame 8, max velocity 5.5985193\n", + "Computed frame 9, max velocity 6.0121617\n" ] } ], "source": [ - "for frame in range(10):\n", - " print('Computing frame %d' % frame)\n", - " world.step(dt=1.5)" + "for time_step in range(10):\n", + " velocity, smoke, pressure = step(velocity, smoke, pressure, dt=DT)\n", + " print('Computed frame {}, max velocity {}'.format(time_step , np.asarray(math.max(velocity.values)) ))\n" ] }, { @@ -213,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -226,16 +322,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAANAAAAD4CAYAAACdW2gvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAOMUlEQVR4nO3dbYxc51nG8f+1ztpO7CLHjeNaSZq4xBBZpXEhWClEKBiCnEDlVCpRAi2WMHKIGtSKChGVAm3TCCqV+gsI4SomBtokJS/EQg3UuKYvAjmxXSf1S1LbJRE2a2828Xtix7t782HOulufM97ZuWfWM7vXT1rt7D1nZp5j+/KZefY591FEYGbN6bnYAzDrZg6QWYIDZJbgAJklOEBmCZdM5ItJ8pSfdaOBiJhXdceEBqhm2sS/pFnK0Kv17vFbOLMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBLGDJCkmZKek/SCpF2SPlvUH5H0P5J2FF9L2j5asw7TSFeeM8CyiDgpqRf4rqRni/v+KCKeaN/wzDrbmAGK2uUbThY/9hZf7u9mRoOfgSRNk7QD6Ac2RsSW4q6HJL0oaY2kGXUeu1rSVklbWzNks86h8VwfSNIc4GngD4DXgUPAdGAtsD8iPjfG48ONFa37DG2LiJuq7hnXLFxEHAU2A8sjoi9qzgB/DyxNj9OsyzQyCzevOPIg6VLgNuAlSQuKmoA7gZ3tG6ZZZ2pkFm4BsF7SNGqB+1pE/Kukb0qaBwjYAfx++4Zp1pnG9Rko/WL+DGRdqUWfgczsxzlAZgkOkFmCA2SW4ACZJThAZgkOkFmCA2SW4ACZJThAZgkOkFmCA2SW4ACZJThAZgkOkFmCA2SW4ACZJThAZgmZ1r4LJW2RtE/S45Kmt3+4Zp2lkSPQSGvfG4ElwHJJNwNfANZExPXAEWBV20Zp1qHGDFDR+62qte8yYKQv9npqra3MppSmWvsC+4GjETFYbHIAuKrOY93a1yathgIUEUMRsQS4mloH0hsafYGIWBsRN9VrC2TWzZpt7fsBYI6kkcaMVwMHWzs0s87XbGvfPdSC9OFis5XAM20ao1nHyrT23Q08JunzwPeAh9s4TrOO5Na+ZmNya1+ztnCAzBIcILMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBIcILMEB8gswQEyS3CAzBIaaSpyjaTNknYXrX0/XtQ/I+mgpB3F1x3tH65ZZ2mkqcgg8MmI2C7pHcA2SRuL+9ZExBfbNzyzzjZmgCKiD+grbp+QtIc6XUjNpppxfQaSdB3wfmBLUbpf0ouS1km6vM5j3NrXJq2G21pJmg18C3goIp6SNB8YoNZo/kFgQUT87hjP4bZW1oWSba0k9QJPAl+JiKcAIuJw0TN7GPgytZ7ZZlNKI7NwotZ1dE9EfGlUfcGozT4E7Gz98Mw6WyOzcL8IfBT4fnGJE4BPAfdIWkLtLdwrwL1tGJ9ZR3NrX7MxubWvWVs4QGYJDpBZggNkluAAmSU4QGYJDpBZggNkluAAmSU4QGYJDpBZggNkluAAmSU4QGYJDpBZggNkluAAmSU4QGYJmda+cyVtlLS3+F7ZF85sMmvkCDTS2ncxcDPwMUmLgQeATRGxCNhU/Gw2pYwZoIjoi4jtxe0TwEhr3xXA+mKz9cCdbRqjWcdqpK3VOee19p1f9M0GOATMr/OY1cDqxBjNOlbDkwhFa98ngU9ExPHR90WtN1Zlf6yIWBsRN9VrC2TWzZpu7QscHulOWnzvb88QzTpX0619gQ3AyuL2SuCZ1g/PrLON2ZlU0i3Ad4DvA8NF+VPUPgd9DXg38CpwV0S8McZzuTOpdaH6nUnd2tdsTG7ta9YWDpBZggNkluAAmSU4QGYJDpBZggNkluAAmSWMazW25f3snN+rrH/6+isafo6/2HukVHv+2N81PSZrno9AZgkOkFmCA2SW4ACZJXgSoQXmzH5vZX3/B5eUaj/xj3dXbqu33mz49T546WWl2un7jpdqCx97ufLxAye2N/xadmE+ApklOEBmCQ6QWYIDZJbQSFORdZL6Je0cVfuMpIOSdhRfd7R3mGadqZFZuEeAvwb+4bz6moj4YstH1PFUqvTd+zOVW864632l2qn7Hq7c9uTr0xsewazL3y7VZq8qj+Hgu8pjBZjx4AsV1aGGX99+pJHWvt8GLthtx2yqynwGul/Si8VbPF+ZwaakZgP0t8BPAkuAPuCv6m0oabWkrZK2NvlaZh2rqQBFxOGIGIqIYeDLwNILbOve2DZpNbWUR9KCUVdm+BCw80LbTyZ/vPBPS7Xp911due2mj/ygVOvtWVC57TSVG1z2VM8BMHSofMeZPyx/TF32T7dWPv7TX72+VPv8/gerX6z6mgFWGDNAkh4FbgWukHQA+HPgVklLqP3pvgLc274hmnWuMQMUEfdUlKvnYs2mGK9EMEtwgMwSHCCzBJ9QV4fq/NF89D0Dpdo3P1J9Mtx3Bsonvv3CO9+q3HbO9PLynHqODc4o1b47MLNUG/7tvZWP/81ry+N9aH/1ZWeCwYbHNRX5CGSW4ACZJThAZgkOkFmCJxHqUE/5QznAu68rt9W9/4nqc3lWXFVeBvPG272V2w6cKdej4twjAFUsr5lTMYQHXzpT+fh/uf1Y+Tl7qvchhj2JcCE+ApklOEBmCQ6QWYIDZJbgAJkleBaujojq2ad7nrymVNsVmyu3/blTt5dqpwar/8ivvazcFWe4zrls+0+Vn+O10+WNdw39Z+XjVzz7S+XXGq6esbML8xHILMEBMktwgMwSHCCzhEaaiqwDfgPoj4j3FrW5wOPAddSaitwVEeU1Ll0s4nRlfb9eKdVOnukrbwh861i5/utXVHflqTJcp366ogvvs6e2lcd1+v8qH7/3sucrqm7t24xGjkCPAMvPqz0AbIqIRcCm4mezKafZ3tgrgPXF7fXAna0dlll3aPb3QPNHNVY8BMyvt6Gk1cDqJl/HrKOlf5EaESFVtNX80f1rgbUAF9rOrBs1Owt3WNICqLX5BfpbNySz7tHsEWgDsBL4y+L7My0bUYd7+eiGUi3ibOW2u/lGqfbzp3+nctt39Jb/Lzs7XH1C3aE3y/NzB47/V6k2OHSi8vH9x5+rrNv4NXKJx0eB/wZ+WtIBSauoBec2SXuBXy1+Nptymu2NDfArLR6LWdfxSgSzBAfILMHnA41TvSU+VU6ffb1UO/xm9XlGV84sd+U5W2ctz+HT5TFUTxh4eU67+QhkluAAmSU4QGYJDpBZgicRJtjs3urr8MybUV4mOFRn5eCc3nIb3p6e8jWDhoerr1tkreMjkFmCA2SW4ACZJThAZgkOkFmCZ+HaaO6snyrVZvVWn+NztmLGrd4s3OyKc4fmzrqhVBs4sf3CA7Q0H4HMEhwgswQHyCzBATJLSE0iSHoFOEHtxJPBiLipFYPqNlL1Fa5nX/KuUu1U1WwB8Nrp8v9l9SYRTg2WTxSadcmVpdrrdcYV8Xb1E9u4tWIW7pcjYqAFz2PWdfwWziwhG6AAviFpW9HCt0TSaklbJW1NvpZZx8m+hbslIg5KuhLYKOmlohn9OW7ta5NZ6ggUEQeL7/3A08DSVgzKrFs0fQSSNAvoiYgTxe1fAz7XspFNAsMVV/o+8nZ1G+CZ08ozZkNRfcA+frb8HIP4KtsXQ+Yt3HzgaUkjz/PViPi3lozKrEs0HaCI+CFwYwvHYtZ1PI1tluAAmSX4fKAWqLc05vhg+SrZA9MWVT/JW7NLpeE6kwivxbFS7eTgoYbHZa3jI5BZggNkluAAmSU4QGYJDpBZgmfh2ujYqX2l2t7Z1Se59fdcUy5WN/DhyNCrpdrxN/ePa2zWGj4CmSU4QGYJDpBZggNklqCos1ykLS8mBVRfYGqq6+kpL+WpZ3j4ZBtHYmVD2+p1nPIRyCzBATJLcIDMEhwgs4RUgCQtl/SypH2SHmjVoMy6RaYrzzTgb4DbgAPA85I2RMTuVg1uKvHMWnfKHIGWAvsi4odRO/XxMWBFa4Zl1h0yAboK+N9RPx8oaj/GrX1tMmv7amy39rXJLHMEOgiMXoN/dVEzmzIyR6DngUWSFlILzt3Ab43xmAE4dzLLFbWfJx3vV/cZa9+urXdHpjPpoKT7gX+ntsBtXUTsGuMx80ZuS9o6Ga9o5/3qPpl9S30GioivA1/PPIdZN/NKBLOEixmgtRfxtdvJ+9V9mt63CT0fyGyy8Vs4swQHyCxhwgM0mVZwS1onqV/SzlG1uZI2StpbfL/8Yo6xGZKukbRZ0m5JuyR9vKh39b5JminpOUkvFPv12aK+UNKW4t/k45Kqm/dVmNAAjVrBfTuwGLhH0uKJHEOLPQIsP6/2ALApIhYBm4qfu80g8MmIWAzcDHys+Hvq9n07AyyLiBuBJcBySTcDXwDWRMT1wBFgVaNPONFHoEm1gjsivg28cV55BbC+uL0euHMix9QKEdEXEduL2yeAPdQWCnf1vkXNyHkjvcVXAMuAJ4r6uPZrogPU0AruLjc/IvqK24eoXYy5a0m6Dng/sIVJsG+SpknaAfQDG4H9wNGIc5dUH9e/SU8itFHUfkfQtb8nkDQbeBL4REQcH31ft+5bRAxFxBJqi5+XAjdknm+iAzQVVnAflrQAoPjef5HH0xRJvdTC85WIeKooT4p9A4iIo8Bm4APAHEkjy9rG9W9yogN0bgV3MdNxN7BhgsfQbhuAlcXtlcAzF3EsTZEk4GFgT0R8adRdXb1vkuZJmlPcvpRaO4I91IL04WKz8e1XREzoF3AH8ANq7z3/ZKJfv8X78ijQB5yl9t55FfBOajNUe4H/AOZe7HE2sV+3UHt79iKwo/i6o9v3DXgf8L1iv3YCf1bU3wM8B+wD/hmY0ehzeimPWYInEcwSHCCzBAfILMEBMktwgMwSHCCzBAfILOH/AScuJ2ZcJ+iOAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -247,7 +343,7 @@ } ], "source": [ - "pylab.imshow(fluid.density.data[0,...,0], origin='lower', cmap='magma')" + "pylab.imshow(smoke.values.numpy('y,x'), origin='lower', cmap='magma')" ] }, { @@ -256,12 +352,12 @@ "id": "wnbQJvA-HPSL" }, "source": [ - "Let's compute and show a few more steps of the simulation." + "Let's compute and show a few more steps of the simulation. Because of the inflow being located off-center to the left (with x position 30), the plume will curve towards the right when it hits the top wall of the domain." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -275,43 +371,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "Computing frame 0\n", - "Computing frame 1\n", - "Computing frame 2\n", - "Computing frame 3\n", - "Computing frame 4\n", - "Computing frame 5\n", - "Computing frame 6\n", - "Computing frame 7\n", - "Computing frame 8\n", - "Computing frame 9\n", - "Computing frame 10\n", - "Computing frame 11\n", - "Computing frame 12\n", - "Computing frame 13\n", - "Computing frame 14\n", - "Computing frame 15\n", - "Computing frame 16\n", - "Computing frame 17\n", - "Computing frame 18\n", - "Computing frame 19\n" + "Computing time step 0\n", + "Computing time step 1\n", + "Computing time step 2\n", + "Computing time step 10\n" ] }, { "data": { + "image/png": "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\n", "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -321,14 +391,68 @@ } ], "source": [ - "frames = [fluid.density.data[0,...,0]]\n", - "for frame in range(20):\n", - " print('Computing frame %d' % frame)\n", - " world.step(dt=1.5)\n", - " if frame%5==0:\n", - " frames.append(fluid.density.data[0,...,0])\n", + "steps = [[ smoke.values, velocity.values.vector[0], velocity.values.vector[1] ]]\n", + "for time_step in range(20):\n", + " if time_step<3 or time_step%10==0: \n", + " print('Computing time step %d' % time_step)\n", + " velocity, smoke, pressure = step(velocity, smoke, pressure, dt=DT)\n", + " if time_step%5==0:\n", + " steps.append( [smoke.values, velocity.values.vector[0], velocity.values.vector[1]] )\n", "\n", - "pylab.imshow(np.concatenate(frames,axis=1), origin='lower', cmap='magma')" + "fig, axes = pylab.subplots(1, len(steps), figsize=(16, 5))\n", + "for i in range(len(steps)):\n", + " axes[i].imshow(steps[i][0].numpy('y,x'), origin='lower', cmap='magma')\n", + " axes[i].set_title(f\"d at t={i*5}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also take a look at the velocities. The `steps` list above already stores `vector[0]` and `vector[1]` components of the velocities as numpy arrays, which we can show next." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = pylab.subplots(1, len(steps), figsize=(16, 5))\n", + "for i in range(len(steps)):\n", + " axes[i].imshow(steps[i][1].numpy('y,x'), origin='lower', cmap='magma')\n", + " axes[i].set_title(f\"u_x at t={i*5}\")\n", + " \n", + "fig, axes = pylab.subplots(1, len(steps), figsize=(16, 5))\n", + "for i in range(len(steps)):\n", + " axes[i].imshow(steps[i][2].numpy('y,x'), origin='lower', cmap='magma')\n", + " axes[i].set_title(f\"u_y at t={i*5}\")\n", + " " ] }, { @@ -337,7 +461,7 @@ "id": "ooqVxCPM8PXl" }, "source": [ - "It looks simple here, but this is a powerful tool. The simulation could easily be extended to more complex cases or 3D, and they're fully compatible with back-propagation pipelines of deep learning frameworks. \n", + "It looks simple here, but this simulation setup is a powerful tool. The simulation could easily be extended to more complex cases or 3D, and they're fully compatible with back-propagation pipelines of deep learning frameworks. \n", "\n", "In the next chapters we'll show how to use these simulations for training NNs, and how to steer and modify them via trained NNs. This will illustrate how much we can improve the training process by having a solver in the loop, and especially by having differentiable solvers." ] diff --git a/physicalloss-code.ipynb b/physicalloss-code.ipynb index ac07b89..b3e0a14 100644 --- a/physicalloss-code.ipynb +++ b/physicalloss-code.ipynb @@ -6,6 +6,8 @@ "source": [ "# Burgers Optimization with a Physics-Informed NN\n", "\n", + "Warning: this example still needs phiflow1.x and tensorflow 1.x! \n", + "\n", "To illustrate how the physics-informed losses work, let's consider a \n", "reconstruction example with a simple yet non-linear equation in 1D:\n", "Burgers equation $\\frac{\\partial u}{\\partial{t}} + u \\nabla u = \\nu \\nabla \\cdot \\nabla u$\n",