diff --git a/diffphys-code-sol.ipynb b/diffphys-code-sol.ipynb index fde74ff..584c9da 100644 --- a/diffphys-code-sol.ipynb +++ b/diffphys-code-sol.ipynb @@ -1,1431 +1,1427 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "qT_RWmTEugu9" - }, - "source": [ - "# Reducing Numerical Errors with Deep Learning\n", - "\n", - "In this example we will target numerical errors that arise in the discretization of a continuous PDE $\\mathcal P^*$, i.e. when we formulate $\\mathcal P$. This approach will demonstrate that, despite the lack of closed-form descriptions, discretization errors often are functions with regular and repeating structures and, thus, can be learned by a neural network. Once the network is trained, it can be evaluated locally to improve the solution of a PDE-solver, i.e., to reduce its numerical error. The resulting method is a hybrid one: it will always run (a coarse) PDE solver, and then improve it at runtime with corrections inferred by an NN.\n", - "\n", - " \n", - "Pretty much all numerical methods contain some form of iterative process: repeated updates over time for explicit solvers, or within a single update step for implicit solvers. \n", - "An example for the second case could be found [here](https://github.com/tum-pbs/CG-Solver-in-the-Loop),\n", - "but below we'll target the first case, i.e. iterations over time.\n", - "[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/diffphys-code-sol.ipynb)\n", - "\n", - "\n", - "## Problem formulation\n", - "\n", - "In the context of reducing errors, it's crucial to have a _differentiable physics solver_, so that the learning process can take the reaction of the solver into account. This interaction is not possible with supervised learning or PINN training. Even small inference errors of a supervised NN accumulate over time, and lead to a data distribution that differs from the distribution of the pre-computed data. This distribution shift leads to sub-optimal results, or even cause blow-ups of the solver.\n", - "\n", - "In order to learn the error function, we'll consider two different discretizations of the same PDE $\\mathcal P^*$: \n", - "a _reference_ version, which we assume to be accurate, with a discretized version \n", - "$\\mathcal P_r$, and solutions $\\mathbf r \\in \\mathscr R$, where $\\mathscr R$ denotes the manifold of solutions of $\\mathcal P_r$.\n", - "In parallel to this, we have a less accurate approximation of the same PDE, which we'll refer to as the _source_ version, as this will be the solver that our NN should later on interact with. Analogously,\n", - "we have $\\mathcal P_s$ with solutions $\\mathbf s \\in \\mathscr S$.\n", - "After training, we'll obtain a _hybrid_ solver that uses $\\mathcal P_s$ in conjunction with a trained network to obtain improved solutions, i.e., solutions that are closer to the ones produced by $\\mathcal P_r$.\n", - "\n", - "```{figure} resources/diffphys-sol-manifolds.jpeg\n", - "---\n", - "height: 150px\n", - "name: diffphys-sol-manifolds\n", - "---\n", - "Visual overview of coarse and reference manifolds\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tayrJa7_ZzS_" - }, - "source": [ - "\n", - "Let's assume $\\mathcal{P}$ advances a solution by a time step $\\Delta t$, and let's denote $n$ consecutive steps by a superscript:\n", - "$\n", - "\\newcommand{\\pde}{\\mathcal{P}}\n", - "\\newcommand{\\pdec}{\\pde_{s}}\n", - "\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \n", - "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", - "\\newcommand{\\vcN}{\\vs} \n", - "\\newcommand{\\project}{\\mathcal{T}} \n", - "\\pdec^n ( \\mathcal{T} \\vr{t} ) = \\pdec(\\pdec(\\cdots \\pdec( \\mathcal{T} \\vr{t} )\\cdots)) .\n", - "$ \n", - "The corresponding state of the simulation is\n", - "$\n", - "\\mathbf{s}_{t+n} = \\mathcal{P}^n ( \\mathcal{T} \\mathbf{r}_{t} ) .\n", - "$\n", - "Here we assume a mapping operator $\\mathcal{T}$ exists that transfers a reference solution to the source manifold. This could, e.g., be a simple downsampling operation.\n", - "Especially for longer sequences, i.e. larger $n$, the source state \n", - "$\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \\vc{t+n}$\n", - "will deviate from a corresponding reference state\n", - "$\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \\vr{t+n}$. \n", - "This is what we will address with an NN in the following.\n", - "\n", - "As before, we'll use an $L^2$-norm to quantify the deviations, i.e., \n", - "an error function $\\newcommand{\\loss}{e} \n", - "\\newcommand{\\corr}{\\mathcal{C}} \n", - "\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \n", - "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", - "\\loss (\\vc{t},\\mathcal{T} \\vr{t})=\\Vert\\vc{t}-\\mathcal{T} \\vr{t}\\Vert_2$. \n", - "Our learning goal is to train at a correction operator \n", - "$\\mathcal{C} ( \\mathbf{s} )$ such that \n", - "a solution to which the correction is applied has a lower error than the original unmodified (source) \n", - "solution: $\\newcommand{\\loss}{e} \n", - "\\newcommand{\\corr}{\\mathcal{C}} \n", - "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", - "\\loss ( \\mathcal{P}_{s}( \\corr (\\mathcal{T} \\vr{t}) ) , \\mathcal{T} \\vr{t+1}) < \\loss ( \\mathcal{P}_{s}( \\mathcal{T} \\vr{t} ), \\mathcal{T} \\vr{t+1})$. \n", - "\n", - "The correction function \n", - "$\\newcommand{\\vcN}{\\mathbf{s}} \\newcommand{\\corr}{\\mathcal{C}} \\corr (\\vcN | \\theta)$ \n", - "is represented as a deep neural network with weights $\\theta$\n", - "and receives the state $\\mathbf{s}$ to infer an additive correction field with the same dimension.\n", - "To distinguish the original states $\\mathbf{s}$ from the corrected ones, we'll denote the latter with an added tilde $\\tilde{\\mathbf{s}}$.\n", - "The overall learning goal now becomes\n", - "\n", - "$$\n", - "\\newcommand{\\corr}{\\mathcal{C}} \n", - "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", - "\\text{arg min}_\\theta \\big( ( \\mathcal{P}_{s} \\corr )^n ( \\mathcal{T} \\vr{t} ) - \\mathcal{T} \\vr{t+n} \\big)^2\n", - "$$\n", - "\n", - "To simplify the notation, we've dropped the sum over different samples here (the $i$ from previous versions).\n", - "A crucial bit that's easy to overlook in the equation above, is that the correction depends on the modified states, i.e.\n", - "it is a function of\n", - "$\\tilde{\\mathbf{s}}$, so we have \n", - "$\\newcommand{\\vctN}{\\tilde{\\mathbf{s}}} \\newcommand{\\corr}{\\mathcal{C}} \\corr (\\vctN | \\theta)$.\n", - "These states actually evolve over time when training. They don't exist beforehand.\n", - "\n", - "**TL;DR**:\n", - "We'll train a network $\\mathcal{C}$ to reduce the numerical errors of a simulator with a more accurate reference. It's crucial to have the _source_ solver realized as a differential physics operator, such that it provides gradients for an improved training of $\\mathcal{C}$.\n", - "\n", - "
\n", - "\n", - "---\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hPgwGkzYdIww" - }, - "source": [ - "## Getting started with the implementation\n", - "\n", - "The following replicates an experiment from [Solver-in-the-loop: learning from differentiable physics to interact with iterative pde-solvers](https://ge.in.tum.de/publications/2020-um-solver-in-the-loop/) {cite}`holl2019pdecontrol`, further details can be found in section B.1 of the [appendix](https://arxiv.org/pdf/2007.00016.pdf) of the paper.\n", - "\n", - "First, let's download the prepared data set (for details on generation & loading cf. https://github.com/tum-pbs/Solver-in-the-Loop), and let's get the data handling out of the way, so that we can focus on the _interesting_ parts..." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JwZudtWauiGa", - "outputId": "30ab90f0-4b0c-4451-81da-f85887aeb7b9" - }, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading training data (73MB), this can take a moment the first time...\n", - "Loaded data, 6 training sims\n" - ] - } - ], - "source": [ - "import os, sys, logging, argparse, pickle, glob, random, distutils.dir_util, urllib.request\n", - "\n", - "fname_train = 'sol-karman-2d-train.pickle'\n", - "if not os.path.isfile(fname_train):\n", - " print(\"Downloading training data (73MB), this can take a moment the first time...\")\n", - " urllib.request.urlretrieve(\"https://physicsbaseddeeplearning.org/data/\"+fname_train, fname_train)\n", - "\n", - "with open(fname_train, 'rb') as f: data_preloaded = pickle.load(f)\n", - "print(\"Loaded data, {} training sims\".format(len(data_preloaded)) )\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "RY1F4kdWPLNG" - }, - "source": [ - "Also let's get installing / importing all the necessary libraries out of the way. And while we're at it, we set the random seed - obviously, 42 is the ultimate choice here \ud83d\ude42" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "BGN4GqxkIueM", - "outputId": "d934bf06-b6b9-41ce-be11-d1d6d3561c89" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [] - } - ], - "source": [ - "!pip install --upgrade --quiet phiflow\n", - "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", - "\n", - "from phi.tf.flow import *\n", - "import tensorflow as tf\n", - "from tensorflow import keras\n", - "\n", - "random.seed(42) \n", - "np.random.seed(42)\n", - "tf.random.set_seed(42)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OhnzPdoww11P" - }, - "source": [ - "## Simulation setup\n", - "\n", - "Now we set up the _source_ simulation $\\mathcal{P}_{s}$. \n", - "Note that we won't deal with \n", - "$\\mathcal{P}_{r}$\n", - "below: the downsampled reference data is contained in the training data set. It was generated with a four times finer discretization. Below we're focusing on the interaction of the source solver and the NN. \n", - "\n", - "This code block and the next ones will define lots of functions, that will be used later on for training.\n", - "\n", - "The `KarmanFlow` solver below simulates a relatively standard wake flow case with a spherical obstacle in a rectangular domain, and an explicit viscosity solve to obtain different Reynolds numbers. This is the geometry of the setup:\n", - "\n", - "```{figure} resources/diffphys-sol-domain.png\n", - "---\n", - "height: 200px\n", - "name: diffphys-sol-domain\n", - "---\n", - "Domain setup for the wake flow case (sizes in the imlpementation are using an additional factor of 100).\n", - "```\n", - "\n", - "The solver applies inflow boundary conditions for the y-velocity with a pre-multiplied mask (`vel_BcMask`), to set the y components at the bottom of the domain during the simulation step. This mask is created with the `HardGeometryMask` from phiflow, which initializes the spatially shifted entries for the components of a staggered grid correctly. The simulation step is quite straight forward: it computes contributions for viscosity, inflow, advection and finally makes the resulting motion divergence free via an implicit pressure solve:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "6WNMcdWUw4EP" - }, - "outputs": [], - "source": [ - "class KarmanFlow():\n", - " def __init__(self, domain):\n", - " self.domain = domain\n", - "\n", - " self.vel_BcMask = self.domain.staggered_grid(HardGeometryMask(Box[:5, :]) )\n", - " \n", - " self.inflow = self.domain.scalar_grid(Box[5:10, 25:75]) # scale with domain if necessary!\n", - " self.obstacles = [Obstacle(Sphere(center=[50, 50], radius=10))] \n", - "\n", - " def step(self, density_in, velocity_in, re, res, buoyancy_factor=0, dt=1.0):\n", - " velocity = velocity_in\n", - " density = density_in\n", - "\n", - " # viscosity\n", - " velocity = phi.flow.diffuse.explicit(field=velocity, diffusivity=1.0/re*dt*res*res, dt=dt)\n", - " \n", - " # inflow boundary conditions\n", - " velocity = velocity*(1.0 - self.vel_BcMask) + self.vel_BcMask * (1,0)\n", - "\n", - " # advection \n", - " density = advect.semi_lagrangian(density+self.inflow, velocity, dt=dt)\n", - " velocity = advected_velocity = advect.semi_lagrangian(velocity, velocity, dt=dt)\n", - "\n", - " # mass conservation (pressure solve)\n", - " pressure = None\n", - " velocity, pressure = fluid.make_incompressible(velocity, self.obstacles)\n", - " self.solve_info = { 'pressure': pressure, 'advected_velocity': advected_velocity }\n", - " \n", - " return [density, velocity]\n", - "\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "RYFUGICgxk0K" - }, - "source": [ - "## Network architecture\n", - "\n", - "We'll also define two alternative versions of a neural networks to represent \n", - "$\\newcommand{\\vcN}{\\mathbf{s}} \\newcommand{\\corr}{\\mathcal{C}} \\corr$. In both cases we'll use fully convolutional networks, i.e. networks without any fully-connected layers. We'll use Keras within tensorflow to define the layers of the network (mostly via `Conv2D`), typically activated via ReLU and LeakyReLU functions, respectively.\n", - "The inputs to the network are: \n", - "- 2 fields with x,y velocity\n", - "- the Reynolds number as constant channel.\n", - "\n", - "The output is: \n", - "- a 2 component field containing the x,y velocity.\n", - "\n", - "First, let's define a small network consisting only of four convolutional layers with ReLU activations (we're also using keras here for simplicity). The input dimensions are determined from input tensor in the `inputs_dict` (it has three channels: u,v, and Re). Then we process the data via three conv layers with 32 features each, before reducing to 2 channels in the output. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "id": "qIrWYTy6xscA" - }, - "outputs": [], - "source": [ - "def network_small(inputs_dict):\n", - " l_input = keras.layers.Input(**inputs_dict)\n", - " block_0 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_input)\n", - " block_0 = keras.layers.LeakyReLU()(block_0)\n", - "\n", - " l_conv1 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_0)\n", - " l_conv1 = keras.layers.LeakyReLU()(l_conv1)\n", - " l_conv2 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv1)\n", - " block_1 = keras.layers.LeakyReLU()(l_conv2)\n", - "\n", - " l_output = keras.layers.Conv2D(filters=2, kernel_size=5, padding='same')(block_1) # u, v\n", - " return keras.models.Model(inputs=l_input, outputs=l_output)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YfHvdI7yxtdj" - }, - "source": [ - "For flexibility (and larger-scale tests later on), let's also define a _proper_ ResNet with a few more layers. This architecture is the one from the original paper, and will give a fairly good performance (`network_small` above will train faster, but give a sub-optimal performance at inference time)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "id": "TyfpA7Fbx0ro" - }, - "outputs": [], - "source": [ - "def network_medium(inputs_dict):\n", - " l_input = keras.layers.Input(**inputs_dict)\n", - " block_0 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_input)\n", - " block_0 = keras.layers.LeakyReLU()(block_0)\n", - "\n", - " l_conv1 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_0)\n", - " l_conv1 = keras.layers.LeakyReLU()(l_conv1)\n", - " l_conv2 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv1)\n", - " l_skip1 = keras.layers.add([block_0, l_conv2])\n", - " block_1 = keras.layers.LeakyReLU()(l_skip1)\n", - "\n", - " l_conv3 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_1)\n", - " l_conv3 = keras.layers.LeakyReLU()(l_conv3)\n", - " l_conv4 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv3)\n", - " l_skip2 = keras.layers.add([block_1, l_conv4])\n", - " block_2 = keras.layers.LeakyReLU()(l_skip2)\n", - "\n", - " l_conv5 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_2)\n", - " l_conv5 = keras.layers.LeakyReLU()(l_conv5)\n", - " l_conv6 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv5)\n", - " l_skip3 = keras.layers.add([block_2, l_conv6])\n", - " block_3 = keras.layers.LeakyReLU()(l_skip3)\n", - "\n", - " l_conv7 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_3)\n", - " l_conv7 = keras.layers.LeakyReLU()(l_conv7)\n", - " l_conv8 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv7)\n", - " l_skip4 = keras.layers.add([block_3, l_conv8])\n", - " block_4 = keras.layers.LeakyReLU()(l_skip4)\n", - "\n", - " l_conv9 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_4)\n", - " l_conv9 = keras.layers.LeakyReLU()(l_conv9)\n", - " l_convA = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv9)\n", - " l_skip5 = keras.layers.add([block_4, l_convA])\n", - " block_5 = keras.layers.LeakyReLU()(l_skip5)\n", - "\n", - " l_output = keras.layers.Conv2D(filters=2, kernel_size=5, padding='same')(block_5)\n", - " return keras.models.Model(inputs=l_input, outputs=l_output)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ew-MgPSlyLW-" - }, - "source": [ - "Next, we're coming to two functions which are pretty important: they transform the simulation state into an input tensor for the network, and vice versa. Hence, they're the interface between _keras/tensorflow_ and _phiflow_.\n", - "\n", - "The `to_keras` function uses the two vector components via `vector['x']` and `vector['y']` to discard the outermost layer of the velocity field grids. This gives two tensors of equal size that are concatenated. \n", - "It then adds a constant channel via `math.ones` that is multiplied by the desired Reynolds number in `ext_const_channel`. The resulting stack of grids is stacked along the `channels` dimensions, and represents an input to the neural network. \n", - "\n", - "After network evaluation, we transform the output tensor back into a phiflow grid via the `to_phiflow` function. \n", - "It converts the 2-component tensor that is returned by the network into a phiflow staggered grid object, so that it is compatible with the velocity field of the fluid simulation.\n", - "(Note: these are two _centered_ grids with different sizes, so we leave the work to the `domain.staggered_grid` function, which also sets physical size and boundary conditions as given by the domain object)." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "id": "hhGFpTjGyRyg" - }, - "outputs": [], - "source": [ - "\n", - "def to_keras(dens_vel_grid_array, ext_const_channel):\n", - " # align the sides the staggered velocity grid making its size the same as the centered grid\n", - " return math.stack(\n", - " [\n", - " math.pad( dens_vel_grid_array[1].vector['x'].values, {'x':(0,1)} , math.extrapolation.ZERO),\n", - " dens_vel_grid_array[1].vector['y'].y[:-1].values, # v\n", - " math.ones(dens_vel_grid_array[0].shape)*ext_const_channel # Re\n", - " ],\n", - " math.channel('channels')\n", - " )\n", - "\n", - "def to_phiflow(tf_tensor, domain):\n", - " return domain.staggered_grid(\n", - " math.stack(\n", - " [\n", - " math.tensor(tf.pad(tf_tensor[..., 1], [(0,0), (0,1), (0,0)]), math.batch('batch'), math.spatial('y, x')), # v\n", - " math.tensor( tf_tensor[...,:-1, 0], math.batch('batch'), math.spatial('y, x')), # u \n", - " ], math.channel('vector')\n", - " )\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "VngMwN_9y00S" - }, - "source": [ - "---\n", - "\n", - "## Data handling\n", - "\n", - "So far so good - we also need to take care of a few more mundane tasks, e.g., some data handling and randomization. Below we define a `Dataset` class that stores all \"ground truth\" reference data (already downsampled).\n", - "\n", - "We actually have a lot of data dimensions: multiple simulations, with many time steps, each with different fields. This makes the code below a bit more difficult to read.\n", - "\n", - "The data format for the numpy array `dataPreloaded`: is `['sim_name', frame, field (dens & vel)]`, where each field has dimension `[batch-size, y-size, x-size, channels]` (this is the standard for a phiflow export)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "id": "tjywcdD2y20t" - }, - "outputs": [], - "source": [ - "class Dataset():\n", - " def __init__(self, data_preloaded, num_frames, num_sims=None, batch_size=1, is_testset=False):\n", - " self.epoch = None\n", - " self.epochIdx = 0\n", - " self.batch = None\n", - " self.batchIdx = 0\n", - " self.step = None\n", - " self.stepIdx = 0\n", - "\n", - " self.dataPreloaded = data_preloaded\n", - " self.batchSize = batch_size\n", - "\n", - " self.numSims = num_sims\n", - " self.numBatches = num_sims//batch_size\n", - " self.numFrames = num_frames\n", - " self.numSteps = num_frames\n", - " \n", - " # initialize directory keys (using naming scheme from SoL codebase)\n", - " # constant additional per-sim channel: Reynolds numbers from data generation\n", - " # hard coded for training and test data here\n", - " if not is_testset:\n", - " self.dataSims = ['karman-fdt-hires-set/sim_%06d'%i for i in range(num_sims) ]\n", - " ReNrs = [160000.0, 320000.0, 640000.0, 1280000.0, 2560000.0, 5120000.0]\n", - " self.extConstChannelPerSim = { self.dataSims[i]:[ReNrs[i]] for i in range(num_sims) }\n", - " else:\n", - " self.dataSims = ['karman-fdt-hires-testset/sim_%06d'%i for i in range(num_sims) ]\n", - " ReNrs = [120000.0, 480000.0, 1920000.0, 7680000.0] \n", - " self.extConstChannelPerSim = { self.dataSims[i]:[ReNrs[i]] for i in range(num_sims) }\n", - "\n", - " self.dataFrames = [ np.arange(num_frames) for _ in self.dataSims ] \n", - "\n", - " # debugging example, check shape of a single marker density field:\n", - " #print(format(self.dataPreloaded[self.dataSims[0]][0][0].shape )) \n", - " \n", - " # the data has the following shape ['sim', frame, field (dens/vel)] where each field is [batch-size, y-size, x-size, channels]\n", - " self.resolution = self.dataPreloaded[self.dataSims[0]][0][0].shape[1:3] \n", - "\n", - " # compute data statistics for normalization\n", - " self.dataStats = {\n", - " 'std': (\n", - " np.std(np.concatenate([np.absolute(self.dataPreloaded[asim][i][0].reshape(-1)) for asim in self.dataSims for i in range(num_frames)], axis=-1)), # density\n", - " np.std(np.concatenate([np.absolute(self.dataPreloaded[asim][i][1].reshape(-1)) for asim in self.dataSims for i in range(num_frames)], axis=-1)), # x-velocity\n", - " np.std(np.concatenate([np.absolute(self.dataPreloaded[asim][i][2].reshape(-1)) for asim in self.dataSims for i in range(num_frames)], axis=-1)), # y-velocity\n", - " )\n", - " }\n", - " self.dataStats.update({\n", - " 'ext.std': [ np.std([np.absolute(self.extConstChannelPerSim[asim][0]) for asim in self.dataSims]) ] # Reynolds Nr\n", - " })\n", - "\n", - " \n", - " if not is_testset:\n", - " print(\"Data stats: \"+format(self.dataStats))\n", - "\n", - "\n", - " # re-shuffle data for next epoch\n", - " def newEpoch(self, exclude_tail=0, shuffle_data=True):\n", - " self.numSteps = self.numFrames - exclude_tail\n", - " simSteps = [ (asim, self.dataFrames[i][0:(len(self.dataFrames[i])-exclude_tail)]) for i,asim in enumerate(self.dataSims) ]\n", - " sim_step_pair = []\n", - " for i,_ in enumerate(simSteps):\n", - " sim_step_pair += [ (i, astep) for astep in simSteps[i][1] ] # (sim_idx, step) ...\n", - "\n", - " if shuffle_data: random.shuffle(sim_step_pair)\n", - " self.epoch = [ list(sim_step_pair[i*self.numSteps:(i+1)*self.numSteps]) for i in range(self.batchSize*self.numBatches) ]\n", - " self.epochIdx += 1\n", - " self.batchIdx = 0\n", - " self.stepIdx = 0\n", - "\n", - " def nextBatch(self): \n", - " self.batchIdx += self.batchSize\n", - " self.stepIdx = 0\n", - "\n", - " def nextStep(self):\n", - " self.stepIdx += 1\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "twIMJ3V0N1FX" - }, - "source": [ - "The `nextEpoch`, `nextBatch`, and `nextStep` functions will be called at training time to randomize the order of the training data.\n", - "\n", - "Now we need one more function that compiles the data for a mini batch to train with, called `getData` below. It returns batches of the desired size in terms of marker density, velocity, and Reynolds number.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "id": "Dfwd4TnqN1Tn" - }, - "outputs": [], - "source": [ - "# for class Dataset():\n", - "def getData(self, consecutive_frames):\n", - " d_hi = [\n", - " np.concatenate([\n", - " self.dataPreloaded[\n", - " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]] # sim_key\n", - " ][\n", - " self.epoch[self.batchIdx+i][self.stepIdx][1]+j # frames\n", - " ][0]\n", - " for i in range(self.batchSize)\n", - " ], axis=0) for j in range(consecutive_frames+1)\n", - " ]\n", - " u_hi = [\n", - " np.concatenate([\n", - " self.dataPreloaded[\n", - " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]] # sim_key\n", - " ][\n", - " self.epoch[self.batchIdx+i][self.stepIdx][1]+j # frames\n", - " ][1]\n", - " for i in range(self.batchSize)\n", - " ], axis=0) for j in range(consecutive_frames+1)\n", - " ]\n", - " v_hi = [\n", - " np.concatenate([\n", - " self.dataPreloaded[\n", - " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]] # sim_key\n", - " ][\n", - " self.epoch[self.batchIdx+i][self.stepIdx][1]+j # frames\n", - " ][2]\n", - " for i in range(self.batchSize)\n", - " ], axis=0) for j in range(consecutive_frames+1)\n", - " ]\n", - " ext = [\n", - " self.extConstChannelPerSim[\n", - " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]]\n", - " ][0] for i in range(self.batchSize)\n", - " ]\n", - " return [d_hi, u_hi, v_hi, ext]\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bIWnyPYlz8q7" - }, - "source": [ - "Note that the `density` here denotes a passively advected marker field, and not the density of the fluid. Below we'll be focusing on the velocity only, the marker density is tracked purely for visualization purposes.\n", - "\n", - "After all the definitions we can finally run some code. We define the dataset object with the downloaded data from the first cell." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "59EBdEdj0QR2", - "outputId": "d9282614-d514-47d8-b911-c262c81c252e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data stats: {'std': (2.6542656, 0.23155601, 0.3066732), 'ext.std': [1732512.6262166172]}\n" - ] - } - ], - "source": [ - "nsims = 6\n", - "batch_size = 3\n", - "simsteps = 500\n", - "\n", - "dataset = Dataset( data_preloaded=data_preloaded, num_frames=simsteps, num_sims=nsims, batch_size=batch_size )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0N92RooWPzeA" - }, - "source": [ - "Additionally, we've defined several global variables to control the training and the simulation in the next code cells.\n", - "\n", - "The most important and interesting one is `msteps`. It defines the number of simulation steps that are unrolled at each training iteration. This directly influences the runtime of each training step, as we first have to simulate all steps forward, and then backpropagate the gradient through all `msteps` simulation steps interleaved with the NN evaluations. However, this is where we'll receive important feedback in terms of gradients how the inferred corrections actually influence a running simulation. Hence, larger `msteps` are typically better.\n", - "\n", - "In addition we define the resolution of the simulation in `source_res`, and allocate the fluid solver object called `simulator`. In order to create grids, it requires access to a `Domain` object, which mostly exists for convenience purposes: it stores resolution, physical size in `bounds`, and boundary conditions of the domain. This information needs to be passed to every grid, and hence it's convenient to have it in one place in the form of the `Domain`. For the setup described above, we need different boundary conditions along x and y: closed walls, and free flow in and out of the domain, respecitvely.\n", - "\n", - "We also instantiate the actual NN `network` in the next cell. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "EjgkdCzKP2Ip", - "outputId": "2d4b34f6-2d40-4273-fc2c-1dac7fe786cb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"model\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 64, 32, 3)] 0 \n", - "_________________________________________________________________\n", - "conv2d (Conv2D) (None, 64, 32, 32) 2432 \n", - "_________________________________________________________________\n", - "leaky_re_lu (LeakyReLU) (None, 64, 32, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_1 (Conv2D) (None, 64, 32, 32) 25632 \n", - "_________________________________________________________________\n", - "leaky_re_lu_1 (LeakyReLU) (None, 64, 32, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_2 (Conv2D) (None, 64, 32, 32) 25632 \n", - "_________________________________________________________________\n", - "leaky_re_lu_2 (LeakyReLU) (None, 64, 32, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_3 (Conv2D) (None, 64, 32, 2) 1602 \n", - "=================================================================\n", - "Total params: 55,298\n", - "Trainable params: 55,298\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "# one of the most crucial! how many simulation steps to look into the future while training\n", - "msteps = 4\n", - "\n", - "# # this is the actual resolution in terms of cells\n", - "source_res = list(dataset.resolution)\n", - "# # this is a virtual size, in terms of abstract units for the bounding box of the domain (it's important for conversions or when rescaling to physical units)\n", - "simulation_length = 100.\n", - "\n", - "# for readability\n", - "from phi.physics._boundaries import Domain, OPEN, STICKY as CLOSED\n", - "\n", - "boundary_conditions = {\n", - " 'x':(phi.physics._boundaries.STICKY,phi.physics._boundaries.STICKY), \n", - " 'y':(phi.physics._boundaries.OPEN, phi.physics._boundaries.OPEN) }\n", - "\n", - "domain = Domain(y=source_res[0], x=source_res[1], bounds=Box[0:2*simulation_length, 0:simulation_length], boundaries=boundary_conditions)\n", - "simulator = KarmanFlow(domain=domain)\n", - "\n", - "network = network_small(dict(shape=(source_res[0],source_res[1], 3)))\n", - "network.summary()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AbpNPzplQZMF" - }, - "source": [ - "## Interleaving simulation and NN\n", - "\n", - "Now comes the **most crucial** step in the whole setup: we define a function that encapsulates the chain of simulation steps and network evaluations in each training step. After all the work defining helper functions, it's actually pretty simple: we create a gradient tape via `tf.GradientTape()` such that we can backpropagate later on. We then loop over `msteps`, call the simulator via `simulator.step` for an input state, and afterwards evaluate the correction via `network(to_keras(...))`. The NN correction is then added to the last simulation state in the `prediction` list (we're actually simply overwriting the last simulated velocity `prediction[-1][1]` with `prediction[-1][1] + correction[-1]`.\n", - "\n", - "One other important thing that's happening here is normalization: the inputs to the network are divided by the standard deviations in `dataset.dataStats`. After evaluating the `network`, we only have a velocity left, so we simply multiply it by the standard deviation of the velocity again (via `* dataset.dataStats['std'][1]` and `[2]`).\n", - "\n", - "The `training_step` function also directly evaluates and returns the loss. Here, we simply use an $L^2$ loss over the whole sequence, i.e. the iteration over `msteps`. This is requiring a few lines of code because we separately loop over 'x' and 'y' components, in order to normalize and compare to the ground truth values from the training data set.\n", - "\n", - "The \"learning\" happens in the last two lines via `tape.gradient()` and `opt.apply_gradients()`, which then contain the aggregated information about how to change the NN weights to nudge the simulation closer to the reference for the full chain of simulation steps." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "id": "D5NeMcLGQaxh", - "scrolled": true - }, - "outputs": [], - "source": [ - "def training_step(dens_gt, vel_gt, Re, i_step):\n", - " with tf.GradientTape() as tape:\n", - " prediction, correction = [ [dens_gt[0],vel_gt[0]] ], [0] # predicted states with correction, inferred velocity corrections\n", - "\n", - " for i in range(msteps):\n", - " prediction += [\n", - " simulator.step(\n", - " density_in=prediction[-1][0],\n", - " velocity_in=prediction[-1][1],\n", - " re=Re, res=source_res[1],\n", - " )\n", - " ] # prediction: [[density1, velocity1], [density2, velocity2], ...]\n", - "\n", - " model_input = to_keras(prediction[-1], Re)\n", - " model_input /= math.tensor([dataset.dataStats['std'][1], dataset.dataStats['std'][2], dataset.dataStats['ext.std'][0]], channel('channels')) # [u, v, Re]\n", - " model_out = network(model_input.native(['batch', 'y', 'x', 'channels']), training=True)\n", - " model_out *= [dataset.dataStats['std'][1], dataset.dataStats['std'][2]] # [u, v]\n", - " correction += [ to_phiflow(model_out, domain) ] # [velocity_correction1, velocity_correction2, ...]\n", - "\n", - " prediction[-1][1] = prediction[-1][1] + correction[-1]\n", - " #prediction[-1][1] = correction[-1]\n", - "\n", - " # evaluate loss\n", - " loss_steps_x = [\n", - " tf.nn.l2_loss(\n", - " (\n", - " vel_gt[i].vector['x'].values.native(('batch', 'y', 'x'))\n", - " - prediction[i][1].vector['x'].values.native(('batch', 'y', 'x'))\n", - " )/dataset.dataStats['std'][1]\n", - " )\n", - " for i in range(1,msteps+1)\n", - " ]\n", - " loss_steps_x_sum = tf.math.reduce_sum(loss_steps_x)\n", - "\n", - " loss_steps_y = [\n", - " tf.nn.l2_loss(\n", - " (\n", - " vel_gt[i].vector['y'].values.native(('batch', 'y', 'x'))\n", - " - prediction[i][1].vector['y'].values.native(('batch', 'y', 'x'))\n", - " )/dataset.dataStats['std'][2]\n", - " )\n", - " for i in range(1,msteps+1)\n", - " ]\n", - " loss_steps_y_sum = tf.math.reduce_sum(loss_steps_y)\n", - "\n", - " loss = (loss_steps_x_sum + loss_steps_y_sum)/msteps\n", - "\n", - " gradients = tape.gradient(loss, network.trainable_variables)\n", - " opt.apply_gradients(zip(gradients, network.trainable_variables))\n", - "\n", - " return math.tensor(loss) \n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "c4yLlDM3QfUR" - }, - "source": [ - "Once defined, we prepare this function for executing the training step by calling phiflow's `math.jit_compile()` function. It automatically maps to the correct pre-compilation step of the chosen backend. E.g., for TF this internally creates a computational graph, and optimizes the chain of operations. For JAX, it can even compile optimized GPU code (if JAX is set up correctly). Thus, using the jit compilation can make a huge difference in terms of runtime." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "id": "K2JcO3-QQgC9" - }, - "outputs": [], - "source": [ - "\n", - "training_step_jit = math.jit_compile(training_step)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E6Vly1_0QhZ1" - }, - "source": [ - "## Training\n", - "\n", - "For the training, we use a standard Adam optimizer, and run 15 epochs by default. This should be increased for the larger network or to obtain more accurate results. For longer training runs, it would also be beneficial to decrease the learning rate over the course of the epochs, but for simplicity, we'll keep `LR` constant here.\n", - "\n", - "Optionally, this is also the right point to load a network state to resume training." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "id": "PuljFamYQksW" - }, - "outputs": [], - "source": [ - "LR = 1e-4\n", - "EPOCHS = 15\n", - "\n", - "opt = tf.keras.optimizers.Adam(learning_rate=LR) \n", - "\n", - "# optional, load existing network...\n", - "# set to epoch nr. to load existing network from there\n", - "resume = 0\n", - "if resume>0: \n", - " ld_network = keras.models.load_model('./nn_epoch{:04d}.h5'.format(resume)) \n", - " #ld_network = keras.models.load_model('./nn_final.h5') # or the last one\n", - " network.set_weights(ld_network.get_weights())\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lrALctV1RWBO" - }, - "source": [ - "Finally, we can start training the NN! This is very straight forward now, we simply loop over the desired number of iterations, get a batch each time via `getData`, feed it into the source simulation input `source_in`, and compare it in the loss with the `reference` data for the batch.\n", - "\n", - "The setup above will automatically take care that the differentiable physics solver used here provides the right gradient information, and provides it to the tensorflow network. Be warned: due to the complexity of the setup, this training run can take a while... (If you have a saved `nn_final.h5` network from a previous run, you can potentially skip this block and load the previously trained model instead via the cell above.)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "m3Nd8YyHRVFQ", - "outputId": "686a3419-d022-4889-c0de-66e4e02953d1", - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch 001/015, batch 001/002, step 0001/0496: loss=2605.340576171875\n", - "epoch 001/015, batch 001/002, step 0002/0496: loss=1485.1646728515625\n", - "epoch 001/015, batch 001/002, step 0003/0496: loss=790.8267211914062\n", - "epoch 001/015, batch 001/002, step 0129/0496: loss=98.64994049072266\n", - "epoch 001/015, batch 001/002, step 0257/0496: loss=75.3546142578125\n", - "epoch 001/015, batch 001/002, step 0385/0496: loss=70.05519104003906\n", - "epoch 002/015, batch 001/002, step 0401/0496: loss=19.126527786254883\n", - "epoch 003/015, batch 001/002, step 0401/0496: loss=9.628664016723633\n", - "epoch 004/015, batch 001/002, step 0401/0496: loss=7.898053169250488\n", - "epoch 005/015, batch 001/002, step 0401/0496: loss=3.6936004161834717\n", - "epoch 006/015, batch 001/002, step 0401/0496: loss=3.172729730606079\n", - "epoch 007/015, batch 001/002, step 0401/0496: loss=2.8511123657226562\n", - "epoch 008/015, batch 001/002, step 0401/0496: loss=3.4968295097351074\n", - "epoch 009/015, batch 001/002, step 0401/0496: loss=1.6942076683044434\n", - "epoch 010/015, batch 001/002, step 0401/0496: loss=1.6551270484924316\n", - "epoch 011/015, batch 001/002, step 0401/0496: loss=1.9383186101913452\n", - "epoch 012/015, batch 001/002, step 0401/0496: loss=2.0140795707702637\n", - "epoch 013/015, batch 001/002, step 0401/0496: loss=1.4174892902374268\n", - "epoch 014/015, batch 001/002, step 0401/0496: loss=1.2593278884887695\n", - "epoch 015/015, batch 001/002, step 0401/0496: loss=1.250532627105713\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training done, saved NN\n" - ] - } - ], - "source": [ - "steps = 0\n", - "for j in range(EPOCHS): # training\n", - " dataset.newEpoch(exclude_tail=msteps)\n", - " if j0 and ib==0 and i==400): # reduce output \n", - " print('epoch {:03d}/{:03d}, batch {:03d}/{:03d}, step {:04d}/{:04d}: loss={}'.format( j+1, EPOCHS, ib+1, dataset.numBatches, i+1, dataset.numSteps, loss ))\n", - " \n", - " dataset.nextStep()\n", - "\n", - " dataset.nextBatch()\n", - "\n", - " if j%10==9: network.save('./nn_epoch{:04d}.h5'.format(j+1))\n", - "\n", - "# all done! save final version\n", - "network.save('./nn_final.h5'); print(\"Training done, saved NN\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "swG7GeDpWT_Z" - }, - "source": [ - "The loss should go down from above 1000 initially to below 10. This is a good sign, but of course it's even more important to see how the NN-solver combination fares on new inputs. With this training approach we've realized a hybrid solver, consisting of a regular _source_ simulator, and a network that was trained to specifically interact with this simulator for a chosen domain of simulation cases.\n", - "\n", - "Let's see how well this works by applying it to a set of test data inputs with new Reynolds numbers that were not part of the training data.\n", - "\n", - "To keep things somewhat simple, we won't aim for a high-performance version of our hybrid solver. For performance, please check out the external code base: the network trained here should be directly useable in [this apply script](https://github.com/tum-pbs/Solver-in-the-Loop/blob/master/karman-2d/karman_apply.py).\n", - "\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0c38ne0UdIxV" - }, - "source": [ - "## Evaluation \n", - "\n", - "In order to evaluate the performance of our DL-powered solver, we essentially only need to repeat the inner loop of each training iteration for more steps. While we were limited to `msteps` evaluations at training time, we can now run our solver for arbitrary lengths. This is a good test for how well our solver has learned to keep the data within the desired distribution, and represents a generalization test for longer rollouts.\n", - "\n", - "We reuse the solver code from above, but in the following, we will consider two simulated versions: for comparison, we'll run one reference simulation in the _source_ space (i.e., without any modifications). This version receives the regular outputs of each evaluation of the simulator, and ignores the learned correction (stored in `steps_source` below). The second version, repeatedly computes the source solver plus the learned correction, and advances this state in the solver (`steps_hybrid`).\n", - "\n", - "We also need a set of new data. Below, we'll download a new set of Reynolds numbers (in between the ones used for training), on which we will later on run the unmodified simulator and the DL-powered one.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "RumKebW_05xp", - "outputId": "b119bc05-2f9d-4289-c951-f9f12627c7fb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading test data (38MB), this can take a moment the first time...\n", - "Loaded test data, 4 training sims\n" - ] - } - ], - "source": [ - "fname_test = 'sol-karman-2d-test.pickle'\n", - "if not os.path.isfile(fname_test):\n", - " print(\"Downloading test data (38MB), this can take a moment the first time...\")\n", - " urllib.request.urlretrieve(\"https://physicsbaseddeeplearning.org/data/\"+fname_test, fname_test)\n", - "\n", - "with open(fname_test, 'rb') as f: data_test_preloaded = pickle.load(f)\n", - "print(\"Loaded test data, {} training sims\".format(len(data_test_preloaded)) )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "rZ9h-gRddIxb" - }, - "source": [ - "Next we create a new dataset object `dataset_test` that organizes the data. We're simply using the first batch of the unshuffled dataset, though.\n", - "\n", - "A subtle but important point: we still have to use the normalization from the original training data set: `dataset.dataStats['std']` values. The test data set has it's own mean and standard deviation, and so the trained NN never saw this data before. The NN was trained with the data in `dataset` above, and hence we have to use the constants from there for normalization to make sure the network receives values that it can relate to the data it was trained with." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "9OPruTGMdIxe", - "outputId": "254e71e0-c471-4fec-df6f-f116227d12f3" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reynolds numbers in test data set: (120000.0, 480000.0, 1920000.0, 7680000.0) along batch\u1d47\n" - ] - } - ], - "source": [ - "dataset_test = Dataset( data_preloaded=data_test_preloaded, is_testset=True, num_frames=simsteps, num_sims=4, batch_size=4 )\n", - "\n", - "# we only need 1 batch with t=0 states to initialize the test simulations with\n", - "dataset_test.newEpoch(shuffle_data=False)\n", - "batch = getData(dataset_test, consecutive_frames=0) \n", - "\n", - "re_nr_test = math.tensor(batch[3], math.batch('batch')) # Reynolds numbers\n", - "print(\"Reynolds numbers in test data set: \"+format(re_nr_test))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sMqRPg2pdIxh" - }, - "source": [ - "Next we construct a `math.tensor` as initial state for the centered marker fields, and a staggered grid from the next two indices of the test set batch. Similar to `to_phiflow` above, we use `phi.math.stack()` to combine two fields of appropriate size as a staggered grid." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "id": "xK1MEaPqdIxi" - }, - "outputs": [], - "source": [ - "source_dens_initial = math.tensor( batch[0][0], math.batch('batch'), math.spatial('y, x'))\n", - "\n", - "source_vel_initial = domain.staggered_grid(phi.math.stack([\n", - " math.tensor(batch[2][0], math.batch('batch'),math.spatial('y, x')),\n", - " math.tensor(batch[1][0], math.batch('batch'),math.spatial('y, x'))], channel('vector')))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KhGVceo6dIxl" - }, - "source": [ - "Now we first run the _source_ simulation for 120 steps as baseline:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "nbTTl15kdIxl", - "outputId": "14521920-1966-41d6-e3a2-41db9fb2f69d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Source simulation steps 121\n" - ] - } - ], - "source": [ - "source_dens_test, source_vel_test = source_dens_initial, source_vel_initial\n", - "steps_source = [[source_dens_test,source_vel_test]]\n", - "\n", - "# note - math.jit_compile() not useful for numpy solve... hence not necessary\n", - "for i in range(120):\n", - " [source_dens_test,source_vel_test] = simulator.step(\n", - " density_in=source_dens_test,\n", - " velocity_in=source_vel_test,\n", - " re=re_nr_test,\n", - " res=source_res[1],\n", - " )\n", - " steps_source.append( [source_dens_test,source_vel_test] )\n", - "\n", - "print(\"Source simulation steps \"+format(len(steps_source)))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vQV0qV5pdIxm" - }, - "source": [ - "Next, we compute the corresponding states of our learned hybrid solver. Here, we closely follow the training code, however, now without any gradient tapes or loss computations. We only evaluate the NN in a forward pass for each simulated state to compute a correction field:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "fH5tFfh9dIxn", - "outputId": "1a3c76f6-e401-479e-911d-4bd58f69dab1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Steps with hybrid solver 121\n" - ] - } - ], - "source": [ - "source_dens_test, source_vel_test = source_dens_initial, source_vel_initial\n", - "steps_hybrid = [[source_dens_test,source_vel_test]]\n", - " \n", - "for i in range(120):\n", - " [source_dens_test,source_vel_test] = simulator.step(\n", - " density_in=source_dens_test,\n", - " velocity_in=source_vel_test,\n", - " re=math.tensor(re_nr_test),\n", - " res=source_res[1],\n", - " )\n", - " model_input = to_keras([source_dens_test,source_vel_test], re_nr_test )\n", - " model_input /= math.tensor([dataset.dataStats['std'][1], dataset.dataStats['std'][2], dataset.dataStats['ext.std'][0]], channel('channels')) # [u, v, Re]\n", - " model_out = network(model_input.native(['batch', 'y', 'x', 'channels']), training=False)\n", - " model_out *= [dataset.dataStats['std'][1], dataset.dataStats['std'][2]] # [u, v]\n", - " correction = to_phiflow(model_out, domain) \n", - " source_vel_test = source_vel_test+correction\n", - "\n", - " steps_hybrid.append( [source_dens_test,source_vel_test+correction] )\n", - " \n", - "print(\"Steps with hybrid solver \"+format(len(steps_hybrid)))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tnHYeOfldIxp" - }, - "source": [ - "Given the stored states, we quantify the improvements that the NN yields, and visualize the results. \n", - "\n", - "In the following cells, the index `b` chooses one of the four test simulations (by default index 0, the lowest Re outside the training data range), and computes the accumulated mean absolute error (MAE) over all time steps.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 318 - }, - "id": "bU-PwcCCdIxq", - "outputId": "66956540-891f-4af7-bafe-22fbd11d8b47" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAE for source: 0.1363069713115692 , and hybrid: 0.05150971934199333\n" - ] - }, - { - "data": { - "image/png": "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5nHwoHUpeeBAP554IoybbgqiXbvm/84uIuuNMSkNrfOYNgillHKVkpJa5s/PY8GCX4Ph0ksDmDQpgosu8m+xw99oQCillJOUldlYuDCPefPyKC217lW97LIApk6NZNgwfxeX7tQ0IJRSqonl5dWwYEEeixYV1AXDxRcHMGNG6wiGIzQglFKqieTn1/DCC7ksXpxPZaXVvjt8uD9Tp0Zy0UUBLi7d6dOAUEqps1RaamP+/FxeeSWPQ4esNoZrrglk0qQIzj335P2XWjINCKWUOkNVVXYWLy5g5sxsCgutS0lXXtmRmTOjSEpq7+LSnT3tB+Fk/v5HX2985513eOihh066z4gRIzj2lt2GpKam8sgjjzS4rv6gf0qpplVdbeeddwrp1SuNxx/PpLDQxm9+48/q1T34/PPubhEOoDWIVqu2tpaUlBRSUhq8fVkp5QRlZTaWLCngj3/MIyurBoC+fX2ZMyeaK6/s2GJvVz1TWoNwkYMHD5KQkEBNjfVHVlZWdtTy+++/T1JSEv369ePHH38Ejh/ye9WqVVx11VUAFBYWctlll9G3b1/uvvtup8wupZSnOnTIxuzZOcTHb2XChCyysmro29eXd9/twubNvbnqqkC3CwfwoBqETHPOyTNTT/5BXFFRQVJSUt1yUVER11xzDQEBAYwYMYJ//vOfXHvttXz44Ydcf/31tG1rda8vLy9n06ZNfPfdd9x5551s3boVOHrI71WrVtW97rRp07jggguYMmUK//znP3n77beb/mCV8jCHDtl4/fV85s7No6CgFoDf/MafiRPDueIK96sxHMtjAsJV/Pz82LRpU93yO++8U9e+cPfdd/PSSy9x7bXXsmzZMt5666267W6++WYALrzwQsrKyigpKQGOHvK7vu+++45PP/0UgCuvvJKgoCCnHZNS7q601Marr+bxyit5FBVZjc/nndeBGTMiufjiALcPhiM8JiBO9U3fFc4//3wyMjJYtWoVNpuNfv361a079g/wyPKphvxWSp25rKxqFizI4403CuqGxBg2rAPPPRfBb3/r/jWGY2kbhIuNGTOGP/zhD9xxxx1HPf/RRx8BsHr1agIDAwkMDDzp61x44YV88MEHAHzxxRcUFxc7p8BKuaH09CruumsvCQnbmDvXGi/poov8WbkykdWre3D55e7ZxnAqHlODaKluueUWJk+eXHdJ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\n", - "text/plain": [ - "
" + "cell_type": "markdown", + "metadata": { + "id": "qT_RWmTEugu9" + }, + "source": [ + "# Reducing Numerical Errors with Deep Learning\n", + "\n", + "In this example we will target numerical errors that arise in the discretization of a continuous PDE $\\mathcal P^*$, i.e. when we formulate $\\mathcal P$. This approach will demonstrate that, despite the lack of closed-form descriptions, discretization errors often are functions with regular and repeating structures and, thus, can be learned by a neural network. Once the network is trained, it can be evaluated locally to improve the solution of a PDE-solver, i.e., to reduce its numerical error. The resulting method is a hybrid one: it will always run (a coarse) PDE solver, and then improve it at runtime with corrections inferred by an NN.\n", + "\n", + " \n", + "Pretty much all numerical methods contain some form of iterative process: repeated updates over time for explicit solvers, or within a single update step for implicit solvers. \n", + "An example for the second case could be found [here](https://github.com/tum-pbs/CG-Solver-in-the-Loop),\n", + "but below we'll target the first case, i.e. iterations over time.\n", + "[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/diffphys-code-sol.ipynb)\n", + "\n", + "\n", + "## Problem formulation\n", + "\n", + "In the context of reducing errors, it's crucial to have a _differentiable physics solver_, so that the learning process can take the reaction of the solver into account. This interaction is not possible with supervised learning or PINN training. Even small inference errors of a supervised NN accumulate over time, and lead to a data distribution that differs from the distribution of the pre-computed data. This distribution shift leads to sub-optimal results, or even cause blow-ups of the solver.\n", + "\n", + "In order to learn the error function, we'll consider two different discretizations of the same PDE $\\mathcal P^*$: \n", + "a _reference_ version, which we assume to be accurate, with a discretized version \n", + "$\\mathcal P_r$, and solutions $\\mathbf r \\in \\mathscr R$, where $\\mathscr R$ denotes the manifold of solutions of $\\mathcal P_r$.\n", + "In parallel to this, we have a less accurate approximation of the same PDE, which we'll refer to as the _source_ version, as this will be the solver that our NN should later on interact with. Analogously,\n", + "we have $\\mathcal P_s$ with solutions $\\mathbf s \\in \\mathscr S$.\n", + "After training, we'll obtain a _hybrid_ solver that uses $\\mathcal P_s$ in conjunction with a trained network to obtain improved solutions, i.e., solutions that are closer to the ones produced by $\\mathcal P_r$.\n", + "\n", + "```{figure} resources/diffphys-sol-manifolds.jpeg\n", + "---\n", + "height: 150px\n", + "name: diffphys-sol-manifolds\n", + "---\n", + "Visual overview of coarse and reference manifolds\n", + "```\n" ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import pylab\n", - "b = 0 # batch index for the following comparisons\n", - "\n", - "errors_source, errors_pred = [], []\n", - "for index in range(100):\n", - " vx_ref = dataset_test.dataPreloaded[ dataset_test.dataSims[b] ][ index ][1][0,...]\n", - " vy_ref = dataset_test.dataPreloaded[ dataset_test.dataSims[b] ][ index ][2][0,...]\n", - " vxs = vx_ref - steps_source[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", - " vxh = vx_ref - steps_hybrid[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", - " vys = vy_ref - steps_source[index][1].values.vector[0].numpy('batch,y,x')[b,...] \n", - " vyh = vy_ref - steps_hybrid[index][1].values.vector[0].numpy('batch,y,x')[b,...] \n", - " errors_source.append(np.mean(np.abs(vxs)) + np.mean(np.abs(vys))) \n", - " errors_pred.append(np.mean(np.abs(vxh)) + np.mean(np.abs(vyh)))\n", - "\n", - "fig = pylab.figure().gca()\n", - "pltx = np.linspace(0,99,100)\n", - "fig.plot(pltx, errors_source, lw=2, color='mediumblue', label='Source') \n", - "fig.plot(pltx, errors_pred, lw=2, color='green', label='Hybrid')\n", - "pylab.xlabel('Time step'); pylab.ylabel('Error'); fig.legend()\n", - "\n", - "print(\"MAE for source: \"+format(np.mean(errors_source)) +\" , and hybrid: \"+format(np.mean(errors_pred)) )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aOQP6iCBdIxs" - }, - "source": [ - "Due to the complexity of the training, the performance varies but typically the overall MAE is ca. 160% larger for the regular simulation compared to the hybrid simulator. \n", - "The gap is typically even bigger for other Reynolds numbers within the training data range. \n", - "The graph above also shows this behavior over time.\n", - "\n", - "Let's also visualize the differences of the two outputs by plotting the y component of the velocities over time. The two following code cells show six velocity snapshots for the batch index `b` in intervals of 20 time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 302 }, - "id": "_3f8uhIIdIxs", - "outputId": "85675563-7fbb-4476-dc15-a33c2e75e990" - }, - "outputs": [ { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABG4AAAFcCAYAAACZR/hrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9e5Qt2V3f9/1VnWd337mj0WPEgHiIp8EEJQiQwRBhWDiYl2MD9kImMhBj7LWybBOHR+wEIxOMSVaAxA4POwFBkIRCIDi8DAHLy8KYV0AmjhAIhZFGo3ndZ9/uPu+dP84Zqev7+945dXv69j3nnu9nrVlzz+5dVftU/fZv76ru/akopcAYY4wxxhhjjDHGbB7VvW6AMcYYY4wxxhhjjNH4wY0xxhhjjDHGGGPMhuIHN8YYY4wxxhhjjDEbih/cGGOMMcYYY4wxxmwofnBjjDHGGGOMMcYYs6H4wY0xxhhjjDHGGGPMhuIHN3eJiPi5iHjtXdp3iYiPOuO2r4mIXzjvNpndxHFudg3HvNlFHPdmF3Hcm/sdx/h2sVEPbiLiSyLidyLiZkQ8ExG/HBEfca/bdRZKKZ9fSnn9vWxDRHz4qtN0TrXrR0spn3cXjvXqiHjseWz/tyLiidW1/18ion+e7dskHOfny7bEeUS8NiJ+a3XdH4uI7zzd5oh4KCJ+MiKOIuLRiPiK82v5vcUxf75sS8zTfn6J27z6Hv8iIo4j4vci4nOf73E2Ccf9+bJNcR8RL4+In46Iw9W1/85TP7tvcz3guD9vtiXuY8m3RcR7I+JGRLwlIj7h1M/7q/n9zdV8/+vPr+UXi2P8fNmiGP/jEfHPV9e8iJ8/Z26PiK9YlR9FxP8REQ/daRs25sFNLJ/I/TCA/xzAZQAfAeAfA5jfhWPV571Pc3Yi4k8D+CYAnwPgwwC8HMC33tNG3SUc5zvNHoC/CeBFAD4Ny3j/26d+/o8BTAA8DOA1AL739KRnW3HMm4h4DYCu+NEbAfw2gBcC+DsAfjwiXnyRbbtbOO53l4joAfhFAL8M4KUAPgTA/3qqyn2Z6wHH/Y7zZQC+GsBnAngIwK8C+JFTP/97AD4ay3n+ZwP4hoj4jy64jc8bx/hOMwXwZgBfc5uf3za3r/7//QC+cvXzYwD/0x23oJSyEf8B+FIAv/McP+8D+G4Aj6/++24A/dXP/jKAt1L9AuCjVv/+IQDfC+BnARwB+FwALwPwEwCeBnAFwD86te1XA3g7gGsA/jmAD7tNmwZYDsZXAFwH8BsAHl797C0A/tNT7fsVAN+1qvcuAJ++Kn8PgKcAvPbUft+/rfp+9N2+AMuJ783Vvv7eqXrvXtW9tfrvT4h9ffqq3TdW//90asffX7X9EMAvAHiROA/7AE4ALE4d65E7uPZvAPDtpz5/DoAn7nVMOs4d5+cZ52J/Xw/g/zy17wmAjzn18x8B8B33OmYd84755xPzWE5sfx/Aq1Zt7qzKPwbAGMClU3X/FYCvu9cx67h33D+fuAfwtQD+1W1+dt/mesf9zsf9NwJ486nPnwBgdOrz4wA+79Tnvw/gTfc6Zh3jjvEzxMBHAShi37fN7QC+HcAbTv3sI1f1L93JsTfmL24A/N8APi4ivisiPjsiDujnfwfLid8rAHwSgE8F8HfvYP9fAeC/AXAJy6fAPw3gUQAfDuCDAbwJWP75G4D/EsCfA/BiLCeSb7zNPl+L5aT0ZVj+xvDrsAwIxacB+Lerem9YHe9TsLz4fwnAPxLfuQ1HAP4TAA9i2Sn+WkT82dXPPmv1/wdLKQellF89veHqT7R+BsD/sGrXfw/gZyLihaeqfQWArwLwEgA9NP9CAABQSjkC8PkAHl8d56CU8vjqT8KuP8d/H7raxScAeNupXb4NwMPUjvsFx/nuxjnzWQD+3erfHwNgVkr5/VM/fxuWfWPbcczvdsx/O5YT0Sdo958A4F2llMNTZfdLzAOO+12O+1cB+KNYuiOeieWSkU9c/ex+zvWA436X4/5NAD4yIj4mIrpYntefX7XxBQA+CHmuv41x7xjf3Rh/Ltbl9sa9binlD7F60NNi3+9nYx7clFLeBeDVWAblmwE8ExE/dCo4XgPgdaWUp0opT2O5lOYr7+AQP1VK+ZVSygLAvwfgEQD/RSnlqJQyKqW8dVXv6wD8g1LK20spMywnna+IiA8T+5xiGUAfVUqZl1J+q5Ry8zbH//9KKT9YSpkD+DEsO8/rSinjUsovYHnx7ljgVEp5Synld0spi1LKv8Wy0/6HLTf/AgB/UEr5kVLKrJTyRgC/B+CLTtX5wVLK75dSTrC8Lq+4g7a9oZTy4HP89+5V1QMsn6A+y7P/vtT2WNuC43yn4/z9RMRXA3glgP9uVXSA5W8hTnMD90EfcMzvbsxHxCsBfAaA/1HshvM+cJ/EPOC4xw7HPZZLo/4iljcZj2B5w/FTsVxCdd/mesBxj92O+/cBeCuAd2D5UODLAPyt1c+evf4819+6uHeM73SMPxfrcvu5zHk25sENAJRS/k0p5ctLKS/Gco3kZ2H55BJYBu6jp6o/uipry3tO/ftlAB5dBTrzYQC+59mnbACuAggsOyjzI1j+adqbIuLxWMpG1Tp+AHjy1L9PAKCUwmV3/AQzIj4tlnLHpyPiBpYd+UUtN+dzitXn09/19G9Jj8/SxhbcAvDAqc/P/vtQ1N16HOc7G+cAgNVvGP4BgM8vpTyzKuY+gNXn+6IPOOZ3L+YjosJy/fbfuM31uK9jHnDcYwfjfsUJln/i/3OllAmWD+hfCOCPwXHvuBfcJ3H/X2P5lxkvw3JpzrcC+OWI2MMy7oE819/KuHeM72yMPxfrcvu55P6NenBzmlLKb2C5pu+Pr4oexzJIn+VDV2XA8s+v9p79QUS8VO3y1L/fA+BD45S9mn72V+lJ27CU8q9FG6ellG8tpXw8lmvvvhDLPwN7vjS+D5Zyu9vxBgD/DMDLSimXAXwflh0XaH5nBZ9TYHle39u+qe8nHSuWr3K79Rz/PfunZ/8Oyz8nfJZPAvBkKeXKGdqxVTjOdyrOEUsR3z8B8EWllN89tZvfB9CJiI8+VfZJ+MBSqvsGx/zOxPwDWP5V2Y9FxBNYrkkHgMci4jOxjO2XR8Tp3zbdlzEPOO6xO3EPLJcZ3K6tO5PrAcc9divuXwHgx0opj63+KuKHALwAwMeXUq5h+Rc5PNff+rh3jO9UjD8X63J74143Il6OpQ/p9NKqtWzMg5uI+JMR8Vci4iWrzx8H4IsB/JtVlTcC+LsR8eKIeBGWT3aftfS/DcAnRMQrImKApbn8ufh1LBPId0TEfkQMIuIzVj/7PgDfHB+wQF+OiC+7TZs/OyI+MZbW75tY/ina4s6/feJ3APy5iNiLpb38dvZqYPknVldLKaOI+FQs1/g9y9Or9rz8Ntv+LICPieXavk5E/AUAH4/leso75UkAL4yIy88WlOWr3A6e479n//TshwF8TUR8fEQ8iOVa0B86Qxs2Hsd5g52K84j4UwB+FMCfL6X8+umdluW6258A8LrVtfoMAF+C5hsZthLHfINdivkbWP6W7BWr//7MavNPBvBrZbkO/HcAfMvqOv3HWP5Z+P9+hjZuHI77BrsU98DyOr4qIj53dS7/JoBnALz9fs71gOOe2LW4/w0AXxYRD0dEFRFfieXbBN+5+vkPY3ntX7CKi7+CLZzrO8Yb7FSMx5IBlg4drK5Hf7WPdbn9RwF8UUR8ZkTsA3gdgJ8oTc/fWjbmwQ2W9uovBvC7EXELS6HVTwL4ztXPvw3Ab2L5m4zfxVIO9W0AsJoAvg7A/wXgD7BcY3lbynLd3hdhuUbv3QAeA/AXVj/7SQD/EMs/J7sJ4P/BUmSkeCmAH8eyE7wdwL/E+Qy+34XlGsInAbwey4t9O/46lkFyiGVyePOzPyilHGMpuPqVWP4p3atOb7j6i5YvxPKVdlcAfAOALywfWL7RmlLK72GZrN61OlbrPwsspfw8ltf5X2B5PR4F8C132oYtwXH+AXYqzgH8V1jK4X42PvAU/+foOw6xtPa/EcBfK6Vs/W+j4Jg/zc7EfFnyxLP/YTkxA5Z/TTlZ/fsvYvlXOdcAfAeALy1LJ8D9gOP+A+xM3K+2fQeWEs/vwzK2vwTAF5+K+/s11wOO+9PsVNxjeb7fhuXN/HUs/TZ/vpRyffXzbwHwh1jO8f8lgP92Nf/fNhzjH2DXYvzDsFwq9my+PsHS6fQst83tq/9/HZbn6CksH2T99Tttf5Sy7q+TjDHGGGOMMcYYY8y9YJP+4sYYY4wxxhhjjDHGnMIPbowxxhhjjDHGGGM2FD+4McYYY4wxxhhjjNlQ/ODGGGOMMcYYY4wxZkPxgxtjjDHGGGOMMcaYDaVzkQcbVnvlUufBRtmlbrPOXmeatusd5DdfxUGfKnVTHUTksrO+RWtB281muc40l5XRvLmbST7+bFo3Py/y87RFyd+F91SlEn0KqmjWi5bb8RFVnYj1+1KXYCG+83jePC83ps06N2fXcTI/ki3dFFTMX+42T8DBYAKmGqiTS59VKJ/1JXHqolBRWbQ7XtqViN1WO1KngMJExql6HF1RxbNGjToH89z2xZyqzHKjphTfADCaU4zndIirs/c9U0p58XO28x4zrPfLAynumydv0Mn5sqrWB7BM4S3yo079YjuO+zMGC+dZVVbVOaAqNZR1KX74MwB0cjyhQ0N8JbZTZYzq/BMRnKNm2fxonquM8xc8pri/Rbs+ml/HaHG80bkeAPbq/XKZ4v6g0zx3/U4+J7WKg2r9eNsqNFuOCa2mRi36mSJt1WKeAOR8DxHiKbcDCC4TdW4zyaE6qqzFdpN8jWdH+TsfUV+4RePEjdl1HG/6HEfE/H6n+V0HdT4f3a7oBz2K+V7LPJfG95anjOf1qhPMRe6j7YqYA/C8oPX8acFV1H2M2Fcb5LSyrK9zxtyzmOVKJ5Pnjvnr0+s42vCYB9rF/Z6Y4/T2ctzHHo2JXXFrLsdpunYyVtfHr9xOxHRJ26k6z/15WSiKWtwnnGmsaVlR3Qe3G19zpfk8l41mzWt69Dzi/kIf3FzqPIgvffivNspe/ZJmYH/KS59O233Iq0aprPPpH9n4XD78g/MBa/H15uKBC8PBCQCjceNjXL2eqpTHctvn77za+Hz0rrzvp588aHy+ejxMdY5mebLLzexXuYcMxCSxT8mkpwZVOZFslnVEnY44XocmrvN5TkBHx/1U9s5rlxuff+59zfPyxie+P22zaVzqPIgvp5j/gkeasfSqj30sbXfw0fkc8SSmTFokZIVKmmJfC3qetBiLBxTjnGdmVFZEEkuIG/a6I8r6zbI6dxVUe+Lc9ZtlckKoJvc8QRvl+J7fEDenV+gBzNXc0PfdOEhlb7/ZLPvlJ3KTfuTJ1z2aSzeLBzoP4jUf1Iz7P/3Sk8bnP/biZm4EgP2DcSori+Z1mYmHYOrB2JweBs8XIlZFLprRAzW13UKM6PzgvN/NY81ev/lEYu9y/r7Dl+S4735QMz9WjzyQ6uDFl1NReag5scT+Xt5uKDoRM87tjMefzMd7+3san2/9+q1U5x1/+JJU9tvXLjU+v/Wp5jn4mSv/ZH0bN4DLnQfxVR/SjPvPfFFz/vKRD97I2z1wksr6e8346fRzXER9xgedKqYpXBcib6tczv1TEZTfq67K7WI+QeFaHeT+Wu3neV7sN+dLMRBzwZ4oozvU6IhxQm1H48TisWupytVfzePEr/3RI43Pb32m2c9f/97Nn+Nc7jyIr3ykGfOf8lAzz33s5cO03ctemufQBy+nOeYjOV/FC/O4if1B87O8RurhMwX9Sf4lWjnK9x/lsJkPF+I3LIvD5vWeiwd3czV/mtD8SYxtZ/39s3w4SvPzSjwXq0V/rUQ+Yk6eydfhbY++tPH5rc80r/H3v3vzYx5Yxv1fojnOp76wGQef/JIrabuXfXIeE7ufSGPiIy9MdYoYu4Nj+iiPIzg8zmUU0+Uwb8cxDgCLW83+wjEO5DifnYgHG+KB3oJ+Ma/GH/UHDIz6hZn8AwYaO7kfLOusPRwW07zzWzfz/ew7nn6o8flfXzl73HuplDHGGGOMMcYYY8yG4gc3xhhjjDHGGGOMMRuKH9wYY4wxxhhjjDHGbCgX6rhRsFZCeVNi0GKh2eFRLhNrWnlNYGkjZgQQM1rLx58BhJCmxV7zFPeEw+GA1hJOZu0uy5QcDtK/10LnpKRQSpXCZ6rtWsJ8vFymPBL8/ea0YTnrQt8LhqOQW81rOwFgIaSeMW7uaTFSluezOg9EES33Vn6DuVjfmRD+Go4TtYaafTYAUA2bG9bCeRDKeUA5JPpK/ia+y4zyRS+vZS9T0fabHKt51/MihMXUD6ZtnEUbCnvr5pRnpF9GrOdnFiJXsM9G7V87bnLO5nrqOkmCr7mSprKcWOxGpX92MilBZ91inFSIcbKQ1DjUvoeDXLbfXNvdGWa3RR3KVnh/UJDjfkpxoGJVwWvwlRcmenm7dmOwyK2k+ygzIZ6Ujpvn/qyoVPptE76qTcI7llDyzVF2ULHUuEjHzfqGqnPX1pe7baiY51yvUE4JdtGBX0ICZJ+NKlP5UU5qWeQn6rAHBwDq5jwgybCBVr8Wl32Fxh/l+lBj2VlcUwBQkW9EuQWLGCNSFxb7VuM5n+Lkh05bbCYF+l0Vp2EvKABEV74xpvlZxGGolwFMqewk+5hwIryBY9pOyNRVDmvl0KRLrnK9vgdZL+OvWtzzacn9ej9cEuFDv2yH53Wq36k5Kvt5OGfeSdz7L26MMcYYY4wxxhhjNhQ/uDHGGGOMMcYYY4zZUPzgxhhjjDHGGGOMMWZDueeOG3aw1Mpxo9aP0tq+uJHX0qf1f+r4bb0AvLZPrRuU3ptm29nRAQCDveYa2oNJ3rdiIvwMTC3WWHaprFPndvc6uYz9Q7VYo6yuH6PcD2rdf3IDbMvi11MU5OX1M3Z9qHXAJ2JdNfWVuQiTMjvbQnq11pqv00KpBFqsq5aOG/rKIdZVV2J5e7XXPJ7y2VSXhPiB3BvRE6lP+QzIcYNeXkNcCcdC1aX8JE6T9DolH8Z2+kBKKZhTzkzOKrUOWKznPy83hHZ5iTKczwHV+ug2ddRa67OehOR0E2MUOsL1wQXCBVd63bzdXrPvqfFOeezuFwqAKX099la19VNwHMh8OBBx0WkRK9KtQY4mMQQthM8r1VNjSZtLLuKelQbsXVtupg5IHyft5pVJZyXGhGDfFADUVMbjRkv47G7LlOcsjhvlUqnICRlDMZYPRUdg35Zy3Kjcx+OryIXKfZdcSGf8Fbgck+br88VczBnbOG4UVcrH7frKIjlQ2o3nPOZuS4wr1ilfajH3lS5FRsUqRPJjp83hSapSTsR2x82yMhZxL3JYaXETlub2dd5G3bnyXEj1DTWOyPnSmn2r7drsB8hxr52teWecE5+PvtJ/cWOMMcYYY4wxxhizofjBjTHGGGOMMcYYY8yG4gc3xhhjjDHGGGOMMRuKH9wYY4wxxhhjjDHGbCgXLifmJ0XsaaqUzEnJIlkOPBIi4rEo4wMqIamCTUITIXM6UsLi5nZKgFT3msalwXC9VBkAZiQnVrIj5cFiGbGSRSrxcIfKKiGdUrCgTEnUWFy6LKPtttRiNi/PLd1Sorn5yXox12wi6oh9pTotzyNfp7OefyUhLNH8Msq9ymJvAKj6zZiv9rMgFZcGqSguDZsFe0JwqDrnvNlXQuSLapRzQT1kOXE+ByypBrIPbtrK6rl5KEkruww5fwFaSMfnTormWpSpOkreXubNa9zW+cgxrMSEPL61FeJlS6sy4gmhIUsOlbBfCbBZPCzkxHJw6TanFEqey3J8QI7wW0kpBdN1Uu6WJlMWtqtzGcPch5I8V10nFT8sJ1ZCXyGnLBPeTtShMGyb1rL4OO9b+tup7dFyppv6oxiDorteWFzGqlH35+9JlYieL5PKvVVPxCCN71JELMbuMqAyJRTOe8oS4zbiWIWUfTc/qphXL3zg+bIS/M7nQk7cQgjdBnE41Krf8bxepRTVTq6zpfP6Nqj5hZrXppOgxmlVdtSUE5ej/PIMHOftWEZcxAs2VP6Xcc6kF4/kKqFeWEJdsbS84Wjz3obW8yxCjlOz9fezUii+5mU7d3J/dX+OJMYYY4wxxhhjjDH3AX5wY4wxxhhjjDHGGLOhtHpwExEPRsSPR8TvRcTbI+JPRMRDEfGLEfEHq/+/4G431piLxHFvdg3HvNlFHPdm13DMm13EcW+2nbZ/cfM9AH6+lPJxAD4JwNsBfBOAXyqlfDSAX1p9NuZ+wnFvdg3HvNlFHPdm13DMm13EcW+2mrXKtoi4DOCzAPxlACilTABMIuJLALx6Ve31AN4C4BvvtAH85EhJi5QgqNwiEbASM05EWbIhC7NRG5mf2Hc5ERIoIX1KhyNJW2+YZaeVkpu2ENEqcVNNMmIlj626QqrV4jGfvFYkY1wIidpcyInXypzWN+fMnFfcl5LbnSStsyyYnI7WG7dmo7ydiok20jol2GLUdVNwfC1EUPSkhLyJlJoN6DvvZTlxEhEDwOWD5udhFhgXFrICiBn1xTqfcyVGrw6OG587HZEvhC5x+jyEZc+X8871LOVOklYRcyoOg6ToKgo7WJ9nFTr9N9utclMb0bESE3LfaC3NS+LYPEaEEvTXTVlhqARd545WWITYFRJwFh8DSfYZ/fwFWY4P5OsQdJXvprz4vOOeBeMsIVdxr6jolKtzWR3kaxd9KmspXC3U8Ji2E1YWup5FxP1iQgWc6HAbESSVLcQ7IRRqHplo0fdYEA0AVV+Uzbl/ivMkpNRc66JErecd8+ucpZWYrdXq/QA8ng9y3il9saHKT7xdleM5+IS3kHYDQOF8LOvQZ2X9FbmA51lS8CvmYm3mCm1Ergq171QmJa0i5vn7XeCc527fz6bjtclDAAqNpXIsF/e45fCEPosX5Kh7UMpPhd8kgfxinduVMVHT2C3mSuoatwnNVvF7ZsG4EHCLyxAt3h10t+9n20wbPwLA0wB+MCJ+OyL+aUTsA3i4lPK+VZ0nADx8B8c1ZtNx3JtdwzFvdhHHvdk1HPNmF3Hcm62nzYObDoD/AMD3llL+fQBHoD8jK8v3dskHRhHxtRHxmxHxmyeLY1XFmE3kzHF/OuZHjnmzPTjXm13EcW92Dce82UXOL+7nR3e9scYo2jy4eQzAY6WUX1t9/nEsA//JiPggAFj9/ym1cSnlB0opryylvHJY7Z1Hm425CM4c96djfuCYN9uDc73ZRRz3ZtdwzJtd5Pzivt6/kAYbw6x13JRSnoiI90TEx5ZS3gHgcwD8v6v/XgvgO1b//6k2B1y3FlYi1gvjsLl2v7Rcjx3JcSOO18JxI9f6qXXNtHZQreOuSJvR6eV9V8IL0KE1j2r9n3IoVHVz/1U3H0+6F7hMfJf5WKzZpTWBan3uTKwJnNKa2Rlfg7u4Fva84r4guz54reNMrGGej4VLhZhOhRtHlPGaYr0+uo3jJpdJR8i8GRi9RY7duuJr2dJR0mueqxiK9e772XFTLtEguy8mm2KdfOEOWwnfyUleV1xdutn43OmIXCR+qcPXaibFD3eH88z1yu2UP69f/w5k5wznLwAoIhC5Xi38T3PR9xYLXoPfrr+w06bbFS4Xbrt0uonj0dgSY7HQWsRhYiokIeLcBbucBr31+wZSkoiectwI9w9f47PKGM7AucY9cpyzPkDFvXIhVH1yBewJn82+uC7sBanbiZSC8jaERwnC45fjR/iXFjQPUuleHG4xpbFLOfSkV+9s8cM+hkrMkLX7gWU863P7veS85/Xr5mI83gNAdMX56NIJV+6ajpgbcZnwb3EMynrs9gK0P5P7Sgs3jszrLcvOC+Ub4dzDHrblduv3vRAOH+nGoc+cL+8m5x33TLq9bOm4SeOyGMuLGPPZaVNuiTrj9f4aeT97xqlnundU8wsxJLXy/ckbjlbNWo/0pynvzfr7UHmPy/Pf5zG1X/vgZsV/BuBHI6IH4F0AvgrL0/XmiPgaAI8C+PKzN8OYjcRxb3YNx7zZRRz3ZtdwzJtdxHFvtppWD25KKb8D4JXiR59zvs0xZnNw3JtdwzFvdhHHvdk1HPNmF3Hcm23nvP7IyBhjjDHGGGOMMcacM35wY4wxxhhjjDHGGLOhtHXc3DWULItZjIUc7HDS+FhGQk48FfumR1VRK9nRejmxelmcltZRmZCYBV2FWuy8UvIz3o8SPokrzFK46LSTRzGlpcxpRmJNJXOaCSHblARPFykxO09YQtVGTjwTItW0X7XdXAiLqZ4SZ2kBK9WBEMCK653Fw0LkSrLeMmvXD4NFmz0hKlQi1eGgebx98UaAvhAdk9BQOvqO8utQq0vNNnQG+dWRLN0FbvMOyi1ESbm5P3Nc3o4kGe61s7qxB7iIPqWEinOWE4s6ChY4Kslj1aV4UrtWX49z6Egk384oFQXLN3tiQFDjHQ8ASnys9sXHE/tWcmK+Mpujcb0zSgGmNFbPKO7VUK7krdWguV21n0WtcWmQyrKceL3oHkCWsI7aiIgBLCg2Jkq+vL7PCoc95lPui7mO6tc8drUVvrKolfsrAAhdLlLmlhLl9ZLzu/nChXtJR7xcg+MbAIJzihIRt5mczkV+HE/Wl01EgIkylsUXMTlt+74FhmNQictDBAqPJWp+ofbFczEl/1fbMSq+5+KlI5wPec/3aRd4P/rFNnOqI4TCYsxnGfHiMNdZiLBX8cq0EVKre8d0j63uL9V2wXXUm3VEI9SY1AaWh6uXGQmheZysP3c8hwTEfd/6Rwq3xX9xY4wxxhhjjDHGGLOh+MGNMcYYY4wxxhhjzIbiBzfGGGOMMcYYY4wxG8qFO27WreGV64BHeaMFZuvrjM/muGmzhFZR1DJuXkfXYiGb9NIofw21XW7XE9+v29yZXG+o1he2WBNYxCL0KitAErz+DwCmyQ1Dx1+/23uOcn3wd50KL81C9AP2QWlXTW4DrzNW51qtRVbrNNvQrdnjkRvVJy9BW49IWs/aFcYBVdbrrq+jHDcV+YFUmy5lfw3IPdHdO0xVumrtutr/FlKg+i87q9Y7H4C85r7TF0MjueoAACAASURBVOdNrMtP+xbruhdChcCxKHN2m74hfQLsL8ibqXGk8Mk8EQ1XDWU/g8rritTP8uASe8IlpRwRhHT/JD8DHWtLOkabfK+ohUsl+nSt9kTO2heOmz3KY20dN1OKKRWcytFH7oVSSflds47qdxMxnpHjZib8Ocr1psbPNvBY1ZXjcI5x7h2qD7dpE2+2DXMcBfdf5XBi1yKA7KxT/gp1cidN10eMhNjjJDvA2N1VxtnrVFROYweJ8lu2ULEpdwy7aYo6dyIGc51cpnJvGpM6Ihepy9AiONUcksf4FvrOrSHA47v4cuILl3GLnCk8roujZtn8SMxxlOOGqqnrK+8nuUzEeEV1pOOmK8aW3hnvS9tMDlSw8nWoxL2r2CyO1ve9ecntnFJfmKVnA+07gv/ixhhjjDHGGGOMMWZD8YMbY4wxxhhjjDHGmA3FD26MMcYYY4wxxhhjNhQ/uDHGGGOMMcYYY4zZUC5UTlyQfUAsqpIOISEZDpIiLU5ynfl4vbQoOkr8Jeqd1yMu5VZKwmRRR0mGqUwJn2KQd8Zl0RUHVFI4likpoZYQgNa32sichJw4yUy3UE5cgBm1e1ZYUtVOuKjEcm3b0Ni3OJ5qA/dVJdxiGRsAFFLs1txZRRvaiL0B6Lg8S52WlE4zRcZACIz391JRXBo2PndyFfSUDI3EhNW2WFmZAszp+rGcTcaTEFlXXTonQk5c9ddL5qX0V+SrwqJJJRpVKa2FfDRJlNW4ouSFLIIPkXtZmIksNAzVN1qMbdHPU4XCMluF+C6VGgPBcb+9v1Oar5FyKzjGAaAiGXEoEfH+cH1ZR4zvKrdOScy6EJJSJW9lYaSIMe57Sk48n+XtWEY8nebvMpvlMh7zFkp6rnIN2ShV+q2mYq5ZNb+gyjVSosyft2FSI+DzxP25I+Yu0UaUrk7ILCffWFBcHok3YhzmsnLUlBPj1jjXESJ4zscqntugpPosC67q/H3VS1xYhKuFs0IMT91HjcEqHc+n6+/d5As0eD98T5h3c19RRP4ox2eUEx83z+b8RLx4ZLo+H/MLIADp6kXF8mXlvU9mciUhX3+vKu9LVc44cx7hkyDaKaTjVZfmVPJWef39LL9v4k7ifntnR8YYY4wxxhhjjDH3OX5wY4wxxhhjjDHGGLOh+MGNMcYYY4wxxhhjzIbiBzfGGGOMMcYYY4wxG8qFyomB9QKehRC4zbMvDBVJg6bHarv1z6WUrOuscmIp1qQzrGRkfBWiK8RjHSHX65PMaU+IiIfdVIYBCVf7ok4boeFJvjB8XQCgvtaUObEAcLlrIdVKUt1ttJiVJFVmWeVciOYWoqymS1JXOXY7QgQ2m/PxhXxOnMwFyWO1OFHEJe1/IepwE5TYTtLG3ijkhVwWYyEh7OR0GGxSVYmALwwADHqNj9VB3q7Xye3ky1dvqZy4oGBKBrxpaZ6ntiLOmsSt9b6IuYG6Li3OnRIBc+IROW0xWb+vst7JLpGCfjpeKHGskB5Kw+AZqPpCCDoV+65JOs5SZYg+hXP1id9TCoRwlj7XYp5Q98V5GlI+aiknLntUryvGdyV45QK13RlFkCxvLXMx5k3zvllGLOXE81zWJreomOugeV60cDWXJVl5yzGdSS9gaD0w3lv4yvG57YixDmJOm1BxKsZuTCjAbhylKuVwlLcjGbEUEQspLAtmk9BeoKYOSgobLUTXbe5H9L7FvtQ9CaHCUEw/E+pFGGn+ux0hLjlL08tE5EcRY8ziJJ/wBXWF6ahdXmW5tYoVNSaBBdji5T48kqgXIoSSE/MLEAZ5/NEv0lkvx9cvfGj2dfniBvHChzjk7cS+xWnhuJ/yfPEOgsl/cWOMMcYYY4wxxhizofjBjTHGGGOMMcYYY8yG4gc3xhhjjDHGGGOMMRvKhTtuFrSQi5eGzqTjJpctaJ24qjMZi7XPvLZPrE9Ta9YqOp724Ijtus01crU44zWvlOyLfYv1wDEgx43y2eznncVe07+BoTigctzwfpQbR6wJrPebCzHrOtcpwoPCa18XdJ62YWlsQV67mNw9pd3zU3YoqbXJHeEKUi4VRjmGCp/hFmuagbzEtDrjlVJruwvFV0ynudJYCEiOjpuflSNkJta37+83C4QHJ62xBYBus141zP2pV9/Pjpvsa5jSKec1v4DODVW/uR91LqsDkYvEOuqEkmHQoFQmwrMg3C1tvAfZ9aGEGbmo8HpoEfZ3MyOWvhjbxLnjcarwRV9umbc7c8s2j3VeklrME2oxBGOPYlqM02UgNhyS90Y5uMSYUCiXymsi+ws5OVTcs2dNeBdmM1XWbLvy2UzFnLFQblH+wVaSjrbQvHIhHD7K95G0fdswqRHwMMUeJzXPbuWiUGO5ctiRb7EcnqQq5WZ23JSjZsy38dkA2VPS5rqp+Zrqmpw/2k4B2F8T6u7ujL+q53ELQKv5oJpXzqivsLtyW7xObWCXDHCb/Kj8dFxHuHEWU8o7yhM2yUHGp1iN5QrOo1VXzXHOKBjr0f2sur9s62Nl1HyfjleUi0fN/XrNnKT8QCrueSo0Y59Z2uL2+C9ujDHGGGOMMcYYYzYUP7gxxhhjjDHGGGOM2VD84MYYY4wxxhhjjDFmQ/GDG2OMMcYYY4wxxpgN5ULlxKUIGRtYVNVOThydpulnPhMyoGmWFin5McMiYiALwpTsTok1axL3dbtCklQ1BUiVElYqQRnLN5WI+NIwleFg0Pw8HOQ6yprG9HupKKbZYlbtN8Ww3a4QPgk1EwuettVZNiPL7pSEZSxrA7TciiVYKk6VKIvrVULKqOKZ+8p0sV5yBmT5Zkf0Cy6TAj4lv5s2Y6ccZ3lh9LOYMO1+ku2upZflhUl+zOJPAFCCZBIWs0gcAPrd3Fe6dB06WywnnlLcKxkxoySWVZ+E8kJEHJdyLmLZnZRIC2kdy1aVoK6MhciaxJZlnPe9GJHIVXg2lQhywfWU9FBKjelzi2sA5HzQkcJBkccHlLNHZ0va/BKDbSKoz3LUdat83jjGASFn7ClZo4j7brNeEUL1OBE5kvvCXASnEMOWOcW0EFIXStMs1QSAuZATz5PIVMR9y5hmlB+T848aT9sgpaTyBQD0/bYw7CMCFcc8y4rFHED+3nhCyW8k5MQClhGXG0JOfCPvazGmnC0EsCofJ6m8+HpJFiy6qoS3U+GtRKpt5MTyeLQvIapdiMvAElrVTpXG88s51jVwMymlrB2n+GU4ALAQ08UQcZeOJ9LxgmJTStFlXm2W1fN2onZ+AU/VE2OZElmnHYlg4XtOJSIeiDIa71pJz4E0b1fdrIzzxar6JFEWLxlR8Px3ylLuVntZteEO6hpjjDHGGGOMMcaYC8QPbowxxhhjjDHGGGM2FD+4McYYY4wxxhhjjNlQ/ODGGGOMMcYYY4wxZkO5UDkxkAU87AxS8mAlHq5Ks56Suap9jafNr3xWsZ2UEwvpK0tY+71sbmLhU91vJzuKLkmS9oT97PJ+LrvULCv9LDVGp4WceCzEsKrs8s3mrgdZHNcR5/N+oACYU9RnOZuIbxlfLeJEyNA6JPKuJ+vjFACms2YMzISsUkqUqe3dTt6upjaxWA/I8jsgC2DjaJw3VHIylh72hLBTxfxJU1hcLon+pGDRZyd/wZ44L12qVm+tnLhgnuTE67fjWAWAaq95DmJfyYmFYJ1FdjLI1suJyygL6qIjbI1Vs16Zie24CeLwSUSMLOhXclclJmRJalvnL4ddUWZEMd5xUZmKPixyFOeM9BKDLR4e+FyqXMtSZwA5flnCCABCPKxkxAkl5WbJuhDDKlljknIL0SbH63wq5nlivrYQL6tg1FyM0XOzHNMdysk85gLthMVSyipfQkB10ss7tgP+ZvyyCf3yAZEb6OUDcSLyrIrdQxqnhYh4fpjn3ovxesmwGiIYNbS0kQxHR0iGufuqOmqOwy9QEXOONpSZyOvixCxo6sX3MQCwEMrX85S03mu4n7NsXI11Sk5cdVvkFBWbLe5f1Qt/+N5Y56b143TF/QdA3V8vqw+VIDmm1XxcyfgHVNZ2njdZf48bYu6HXvP+tarb2JjFfV9+U1Nr/Bc3xhhjjDHGGGOMMRuKH9wYY4wxxhhjjDHGbCh+cGOMMcYYY4wxxhizoVyo46YAmNPaNl7vqNbjqbXPvBhVrSVU8P4n87zOTS2/U+v9GOUl4fXsyrvDa7TrnliPrQQRvCZQrf8TTo7ygsvNz33hh1BraGlNXvRGuc4oO0figeb+u3tHqU5H+RKixTrpDUe5Plj70NazVHeb++n0ckyodca8vFPFV3eS1/vPZrQOdtaub6Z1sMLp0O3RWnbRd1Q/LGPq94dqDbzYkN0MtVjfKmI+jprrWWOi1rwK9wS7nkTw1sr9cx/E/LMs1ridFBzjAFAN6Vopn82lvVzGjhB1zVWskMspujmnFRUr5AaIjnAqsANGLI9mnw0AzEbNsqlYn636J49bbXMNuz6U16NW6/LpfCpfz6LFWL1NnoPTBICal+pTn1Zuq6ovYpPjVY3Jbdo0E0F2IsZuynU4ynXKLeG9OW7uP3lDkJ027V1L6/Mh50wgu2mUV4hjHAC6lH9UPgrRF9p8HzWH5PnvjH0fW9oROFTVvET5ZEBOiaJ8NmKuUo6a2ymfzfxwvXupLSkGxJ1URd03emLMUGUkulMeHOXMS94b6d1ZP6+HGEeAfD4r9g2KXavxhucBrEDZpphfpz9S97NFOFtLm8mROFib/Kjbla1UqU3KcTPmuf16x41yarJHEECOQxWrYq6dHK3KjSPmeVGLuTxzIu5nB839V+I+TD0L4G88pRuzcgezHv/FjTHGGGOMMcYYY8yG4gc3xhhjjDHGGGOMMRtKq6VSEfFHAA4BzAHMSimvjIiHAPwYgA8H8EcAvryUcu3uNNOYi8dxb3YNx7zZRRz3ZtdwzJtdxHFvtp07+Yubzy6lvKKU8srV528C8EullI8G8Eurz8bcbzjuza7hmDe7iOPe7BqOebOLOO7N1vJ85MRfAuDVq3+/HsBbAHzjuo3YEZTlxFlIpGSGLOJSQislCGJmQh41VYJkaoOSUqmnYDVJp5SsikV6/ZGQr4myJHgSMqeiZE57JCzezwJjVOLbTEkcp+RR+1kSGiQT7Rzk7fq1ErU2P3fIvHWPxK13HPdzihaOeRVLUsJIUuHOvhJu5e24b9QzJelTwmLqm0qqJkR2fDz1XSqSPlYqEyl/2YgKIwvGWBILAHFC9dqKPofN/qP2jX0hy2U5sUhQnY4QZrJfcDPkxGfK9etka1IqKsTZcdCUz4U630pOzLJ2Ja1TTNfHSsxFjj6hay5FkPRRyDFZRAwA41Gzg0yn+bvMhGhfjaeMEoOn/czy9523EHsulHxZCM1Z3MovMbhHvso7jvulnLj5Xbp0fpUoFz0x3raJVyFvjQnF4VgIFg9v5X3daL40oBwKOfFRzrcsjF8I7zFLqpWoV83XanppQS1OkxwreTuRa1mQD+Rxqe60i7w20m/54o0U960Odzc5U65n+JtKca2Yh5RxM2Go8bZM83Vb3CI58VHe9/RY5J0WOUzJqGv23iv5Mu9HSIZZRAxk+WmI3BDdFi9XUONPGzmxkD8r4oRk/OIcqH4+XSfkbnX0c+eO474AmPN4nl48IrYT6Z/LouWfVHA9KQuWL35pxs9UjMlFND5ou2qc911TXPBnIIutAT2nyjsXcd9KTizyCPWFUCL0YT8VRb85F6vEu0lUvlsXG3cS923/4qYA+IWI+K2I+NpV2cOllPet/v0EgIfv4LjGbAOOe7NrOObNLuK4N7uGY97sIo57s9W0/YubP1lKeW9EvATAL0bE753+YSmlxG1+bbfqGF8LAHvVZVXFmE3lTHF/Oub7celiWmrM+XAuud5xb7aMc4n7fc9xzPZwLjF/qXbMm63iXOL+wHFv7hGt/uKmlPLe1f+fAvCTAD4VwJMR8UEAsPr/U7fZ9gdKKa8spbxyUIk/ZzdmQzlr3J+O+Z5j3mwR55XrHfdmm/Acx+wa5xXzw1ostTdmQ3GuN9vO2r+4iYh9AFUp5XD1788D8DoA/wzAawF8x+r/P9XmgLyui5e5zotYa9dqnX4uq8Say16nuYZ2IrwAY7Heb0rtmrVoEwB01CJHbtOkuUhuj/0YAIbjLAvgtb4xEUIB4SbgBZVlIJwRtQiNTrNdck3g3nr/RH2Qz2+/k9vZpVPM7oC7qf84r7gvAGYktuBl22odsFqXWvebsVQNhSdgsP5ZrFxbPlHeG3IzqDq8yBdAES6ctYi+WkQ4L8ZUTzkexLrbJI9p26x+sxEVL1QFANXvuJ5Yqy/XI6df9Fyc5Oa8c/06uiLGO0OxrnqfXDUHIsfsD1NR4bXPwvclISdIqGt+nL0hyR8gtuM+NRvn/joZ5zFpNG62fTzN+Vm52di9oX6RKK8DeVhUjmJvyXL/XKeds45bJdLKXeO8457dbPy52835QvkvEmosn2TnDOfEODzKda4dpqJy47j5+TDPQxZHue3zE3JUiGsOuubKZ1MJ90+XxgUVv2rux/6wuivyb1e5S+h4IkcrFnQZpNNF7Co7Hy/G93G3c30bb1YRXr3kchS5qQgHy4I8GouxcKscCy8YOfqUp0W56FhWFsKFlLKx8jMpfw07bvpiLt4THg/2f7QV5FEQRkfMZ0Tw8lyzbV+ZJa8T3Y+02svZOO+45/6aXG0txuRV6fqDqfihuGNHFwB0hMurQ/e4yoWn2g4KDZXHO9QXO8I3VR8Jv9gxJVE13in3KjttumKep8RCXEWcp1D7GjTLlONG3b8xi+cR6W2WSj0M4CdjORJ1ALyhlPLzEfEbAN4cEV8D4FEAX37mVhizeTjuza7hmDe7iOPe7BqOebOLOO7N1rP2wU0p5V0APkmUXwHwOXejUcbcaxz3ZtdwzJtdxHFvdg3HvNlFHPfmfqDtW6WMMcYYY4wxxhhjzAXjBzfGGGOMMcYYY4wxG0rb14GfCwWs9ALmJGpSEkRFkiIJMZaSwfVIwjSYZxHXTEiZuJ0zZDkY1wGQvvBcWOt4u/ksH3+RPYEoE9r5OIsK4+g4leHGzebnfpZ9lgdfkLdjYTFLoVQdAOg35aLVpWxzGvZy23skiqu38DFjQcEcTemVcAMnaiHEq8m/Wl/K55rFdrJNSraq5LkUX2Uq+lgLqbGSDHO/UO4wWTZaf3z9OJqlxqqO2BXJcjvVKNdR55OPzn0VWoTIcuK2+XATCRIr8zdRUlwl3I4hyYmHIl8Ns5yY65VeL9cRBAvwjvM1l1AfUtd8QbuajdaLiAHghAT245kaf9YnyDpEXlGi2BZyURbOAllYrES1Snp4rySt500E0CEpKMe5lJ1WYtzkkzIV4/tYSLK56PrNVKVcFXLia83gnN8QcuJb62N6Pl2fs5SYvStik3Okkv6GGitZ2ilOr5ITB9dTXUqNSxSvKrcr5slhv51xz+3k0ybf0aEmQjznUMdSUmOaByjp+3SqytbfAi2ETJxHEhXPpd/i6gmBcHQptw/yeBB9YURlYXG0nDDzRGskthNznOg381EtzpMaRzgWphzzWxL0peT+mz4rEX+buacSEYsynkKxXB0AukJYPCfx70y8pGchLgSP3RMxD6lGzdisb4l57lDEyhHF04m46RX360lY3DnjYw0lQx7kOSP3vWqQr7Gc26Z3V5w90LfwVtgYY4wxxhhjjDFmN/CDG2OMMcYYY4wxxpgNxQ9ujDHGGGOMMcYYYzYUP7gxxhhjjDHGGGOM2VAuVE6MAsxJRJXEvELmpGAZmJTWCdkd0JQbtZV/BkhIJOpMhRwySK9Wt5DWqTYthPCvHDe/Szk8yce/liWEaU8t5KoAUPb312+3EOecJMYxzGE36GfxYp/OVSeeW3a6qSwoBtqcbiWwrPaa8RUPKGmdsjDSeWspJy7TpqyrjLK8S0p3x82yxUgI6lhgrOTbQmy6IDdZEX2ljfxN7Ruib3apnVVPydHUvppl8ty1yHXbIupjAoEOZckOpcd+J5+Tak+ck2GfNhSSYSGRKwPeLkuNZb6aiGBk5qovUH8Z533PSPw4HuX+OhbCTJYRj4VMsIiMmMYf5ZNXIj3qC61kxQIV41LYSG2fUSfepn7A347lzyzOBaBzCMsSxy3iEgAmlKOuCDnxlTxXmF9r7n9+JKSWeTMsJpTrVP7leBK5Vs7hKGcoCWwbyXAlXK7REf2lxYxYyfZZ+K++y0L0zxm/9GIL476Usla0qfKAPI9CPJzqiDlHYSm6muIIkep4uv5lDm3uSVRcdrj/iq8Wqt/TQClFxCzsB4AeB33L38vzGKgGCSUnHjQt6FVXyNPFuJGFvizk3oKgx1KcncTK1MfV/FTBeS7qlnc3Pcqr4jrV/Rx4PZq/zIX0d1FyMmSJsXrRwITmL/WJkMffFGU3mvFTqfvZkRgDKX5Ly7iPVi/bEWUkAY9ePl6nzvNDvqSVGiRa4r+4McYYY4wxxhhjjNlQ/ODGGGOMMcYYY4wxZkPxgxtjjDHGGGOMMcaYDeVCHTcF2ffBa3zlOn2xHprXlMp1znmZWdqXWmamPDTsAejx+lUAE7GGlr9PR/gEerQeTvkEFsr3QWvQqxvjVAdVXt8e4+ZawjgSC9eneb0qHn5JLmuzHdPL56nXy23vseOG1i4+jyWCF0jBghY389VV17vuC//HPq2t3M/rnGNfeDx4HbVYB1tEPMe0ue41+nkdbBmLsmMuy/ue00JnuSZ9rFxPzRiYz4RDY56fR/P+1dpjtR6bpTr1kUgqVT4H7E9YjMS6/JL7AV8qXv+9TdS0cLtD57fXyeetGoo1xYPmGv/SE2v+u2LNP5d1xXbCVZMkHcItUo5F2VEz982P8rWbjchVI302uWxKa8nZDXc7+jROdmox/gjXUIfKlMMhRBmjwlf1PU5JOe63ox8Ech/u8pxD+Muk+IzGabkGX+RtnDTH0nLtOFVhnw0AzK412zU7EddJzEOSL6yFv0a6apSercvnLteJbm5TxelA+WyUR0I5R3g7lnQAKORZkNdYwLuaJWfGdsS9OCUNZB6YqXlIi5wiTm0qU04dkXeys0M5udZfS+m4IcdZPVFxI/oKx6CYLyunW3K/tYhlADn3VDk3hBonyaeY+hyy30vBXqdtoSD3V76fbe1QpUss85z4M4uS5r/iXkKcXy7qibhftOhDynEzpfl3jPO8q76V29SlMam6PMrbHeUyOQYybfqCcuO08N5EVzluhMMn+PPZna3+ixtjjDHGGGOMMcaYDcUPbowxxhhjjDHGGGM2FD+4McYYY4wxxhhjjNlQ/ODGGGOMMcYYY4wxZkO5UDkxkCVl66RmgJaG1j0S8/ZEHbGvBQnClFSsFmIhljX2p1msyaIzIMvO1HdhOWQtxHbK3zU/IXGfEA5Ws7xhHDXrxY0sL4wTITpm9vdy2YmQR03oXHWEzGmQBVN9ug4hr+hmsxRyP7d8jeWVANAdCGndQVPyFZeGeWdnlBOHkmOyaLovxNNHIk5oXzFeL5/LkjVgPslxMh41U9Z0qvpc3k5JBxklJef80D0R/Unki+iRdF2ICZXok5ltqZw4AHTJpteny9LvCiH2QPRxlgrXedgqUixH9VSdsYjfI8qHhzk/4jDnucVhM8/NjvL15fhVQnsVqyw5VK69OtaL7wdCCN2VcmIaX7t532rsZFS3U8JGngewnHibegGLeFnQWcmJiRCX0rgZVYsxGUA5aY7vC/HSAhYRA8D4kATYY/GyBXEh2oiHg+JHioj7Iv/2Ke4HQjIs5MTBcwwlJxbzkPSrTCXCFXOqiqS6dUd8FxHFLBnfRlFrATCnZidXsOjzRXnh6TxqIev6NilxOr9gRLVrIubw04XqB83t1NyhSzHf2c8NryctrnctEgaLiFWZEqsqWO6qBhclgB2QnLift1PnfDteKrKeUoApy8RbyIhlfqT8xPNHQEirAYDyjJriyNGT2y3k02p+ynNr1a9nJCeWLwI5Fv2FxqT6krifvXYrleGR5vgWM/HCFJ4LtkTNK4P7Va+dnLhL8wCWE9+Jnth/cWOMMcYYY4wxxhizofjBjTHGGGOMMcYYY8yG4gc3xhhjjDHGGGOMMRuKH9wYY4wxxhhjjDHGbCgXKicuKFk62MI6yKJEAKhJZFcLT6ti0SWZUy9LmapxblRn2mxDd5K3m8/zc7BFCylqRWIz9X0VC3LFzo+E1HiWhbJxRNLDrpBAneTtKpaEvujB3CghuUrCYiFirLtCVsVSRzqV2+A4CwAVPR/ldneFwK0eCoHZPsnnlIh4X3SENpK6hYg5FtIJYXUoGxr3jVrYBOlws8l6kSsAnIya52A0zXVmLeTESpA37OaYH8xI2DnNG1ZTca04z+UupvMF7WpL3cQIBDrUYXuU53q9HBfR76ay1pLFdYgYj5OTXHbtZuNzuXqYd3Uty4lnN5r7nxzl2GSZthJpKzp07kJYU1lyD2QZ8VAIxgeDXMayeClbFS8EYBtxCGmnYkYCwylJWrepG3Cf7dA4pl5QIP314+Z1KSoZiJgut0hOfJj72eRWjrvRrWbfmwlxdiXaXpGIsSu+TEXdWsljldy02iM5cT+3SQrNWUZcK8mkkhOvF/ljKqTqE5YvizpK1E2f5xTp2xL3PK9nipgHt/Ewn9XVrKTG6qUfLM9dlJyzlSy+UD3Vp/mFJt2jHBP1WNx/iHuLvHMhTB70aectx01qp57TiTkcjdVKqNsVktb75a8F1P0sj2MKFZvB71EQeU6dOH4fQRH3EnJwYTmxGEd64l5uRvcELCJWKOH3YixE1of0IpBn8kshOlePUllFL5Moly+lOjKm1T1PGyoWSed9d8WLN/o0F+pSm+5E2n2/9CFjjDHGGGOMMcaY+w4/uDHGGGOMMcYYY4zZUPzgxhhjjDHGGGOMMWZDuVDHDQAsaNVum1VmlVgPmVukVgAAIABJREFUzU6bak+tVxZFMzq+cE9U3dwq9snUk1xnPhNrYcmR0cZZob6vYpG8IHm7MhH7St4BsfZXrMftDq81Pss14mpN+JhO8ky4JoRDQblfto9AB801njVdtl4t1j7v51gKdtoon40oKx1eQNtyMSWtZw3lGmEPDgD0qJ6IiTnpciYnORUdnfRS2a1xcx33yazdmnSmI2JLXQdem78QX5dzAwDw7uV2op0LWiM9P+si/3tMBNChRbu8xrfXV7EjvE2MctXM8hr8MhHJnbl+PZc91cxz5em8rnp2RXhDbjbz4WSc+8tMrPdmauGF6UTzeCo3KsdNr9vcro3PBgC6A/KLCQeZ/LUP9/WWjhuuxXFftsb2kWmTbYsYEzEiF52qI3JrOWluNz/JdaYi37I/TPkLlMuD4y4i9426sEcjVUGV031yPcRBbnf0xTSW5yZqrtLGASImbCF8HzFqfr+qm+soPxCzjXFfCjBPbrZIdc6CihPp+qAyNYdW7kiO3UrMlyeLHCfJTyeGGvbn9A5znu0c5nxck18ypsIvo+B47glfnILvUUSVGOTOGQNy3PTzhemIOVWXnZ7yIm8+BetdbKrPq3ud4DynvF1yvF1fR0/3mxvWs9ymepr7C7tdJ8IxuaARbyrGEVXG9K7luO8/md2C1RF5Ckct5n0KNa9UHhz25Qh/WreX+zXHfZddOS2a+P4m3EFdY4wxxhhjjDHGGHOB+MGNMcYYY4wxxhhjzIbiBzfGGGOMMcYYY4wxG4of3BhjjDHGGGOMMcZsKBcvJyZLGbv1Qqix6l4WBLGMuNpXMieh+yEJU/TFvsXxWGJcpqKdQmy2oHqLuRAY0+GUyE2VsQxZ7bsNat/dsfh+V5oSqGp4mOoogW0hmV+ZZGFZiKbX8dyxsvnaPiAQqElOTB4yDLtZZFXti645JEHcMItcy1AIi1lSp6SMLNwCgDldt1wDwWIwgeors5Pm8Y6Ps/zucNRPZTcmzXojIXtV7eRY2m8higSAYLmqEAoXISVnCbuqkwSHyG2fbaucGECH8u+gJiGeyL1SIsqCuLmQGo/HqSg4pqdZWhdPPJMP98SNxufZk3nfk6uiCcfNPjuZCHEfXWAWWLYtkyLiXpb5sQC6MxD7Ftehpq4XXSFLV5eK+notRIyKGUu5W722YPMoyKJWzj0SIYfEtHntylycE7FdOebxVux6mvPm8bg5TkyFlFXFJotoKyGk7iWJvZI+ihgjSWcMhXB1kMuiS21XYn01P+QyJX8WMsogkXTVzzlDnTuGx41toACY0nlq03tV/khl8hoJuStdXiVTr4UMv0/XrS/y6ljMMSaLZkMXRUizKQQ6t4Ts9boQFj9IcuJRnh9KaSrHuIp5BY+Tat9d0e/6zbmYEup2u0JOTPmQ5wlxR5rWe8u6l0comXslTmX06BrwTQJavgymo/pLvgbchZQcvyPm7Z1Rs17VIqdNF7ndM1E2p3Gkeyvf3xw8kwez7o3jZsFLcu5t9UIW9aIV9bIdQl0X9YIjnv92opkzLCc2xhhjjDHGGGOMuQ/wgxtjjDHGGGOMMcaYDcUPbowxxhhjjDHGGGM2FD+4McYYY4wxxhhjjNlQLlxOvI5aiMc6fSF4InlrXMpy0xBCIhb8xUTI9npCnkv1lHC1UnJikvwuRJ35mMSMQmRaZvkZG8uIlWR4UYQ4NW0nxKljIb88JAHfjSymLT0hRGPxldi3ansbn9SmEwC6JCfuUYwPhFQ0DkTX3GsaQ8sgxzxEWemT5EuJ5jrieJOmCCyOR7mOkjeS8G9+lPvY6FbzuygR8fVJLjucNts5FbGrBOdDFuMKaVy3VtLs85FFKoed6nd8OudbKKt8Fu6/fYp7KSeWkuzmdYlRls8VlSxIshiHR3m7J6/nw72vmddGT+d9n9zMfYhlxDMhtWS6tZACijhkyaOSPnYGoqxH53zYTpZYDeg7K+mhgC9fJdJKJfoU5/8Z6U23qRfwCxjU92WUHBKTNkJFcS7TCxHyZkqMPqF4PZ7li6e62ZxEkypn9qbNMUFMsTQcd0pEvJ/HCXSp7W3lxIwY39S8EifNsTL1HwAd0dfvh9+cKiF3K9SXp+stz7Xajk5tCCm6EqX3+s24HEzyXGw8Wy8nngiRd6H+q/JA/7oQyl9tzrNqMc/GWBjHk/m+7e0dtUG9YESURY/uwaScOIuVef7bp0Fjm+f93HR1PyvlxCxhH4hr10JOLAXGLU5oJcaR6kTkq/rOxzYlIj4RcyMuU82+fC33hT2SE8dJvk9R8ZtM6OqlF0rUzYhzzvMuAOiTyLnLUu47iPv7YdwwxhhjjDHGGGOMuS/xgxtjjDHGGGOMMcaYDaX1g5uIqCPityPip1efPyIifi0i3hkRPxYRYt2GMduLY97sIo57s4s47s2u4Zg3u4jj3mwzd+K4+RsA3g7ggdXnfwjgu0opb4qI7wPwNQC+d91OquB1n82fd6u8zkyty489Wl95IPqZ8CXEjPavPAsT4bqYNsuKcuOMxHYdrifWpNNmc7G2fTrN32U2aa7bm4l167z+fFm23nFzgOyRWBw316suDvM62+itfxZYxPnFYv0Cv3vgOXjeMR8IdKN5nQa8xneQ1wHHcJDK0KcYV66arugHXG84TFVKTziiUiXRV06Eb4TiYnI9x8TRcdNLcHOcj88+GwA4phgXCgL0xXLWDq3FHXSER0SU8ZpeiDXLCl6vystpAe11mlNfnKtzfvc5h7hfxv5perTGV631lrB3QKzvl9mjonpXs89m8cRhKhs90fx8dD3H5micG6/yL8Nr3pXPpiecV70+OW6GYpxULjhKI1U/n6lqINpd0/rrlo6bUvM1Pps3ag4aby8m+z/vuC9lve9Djbfy63FyU54s4cYpwlfAKDcB+/CU40bB8wnp8qC5Uf9ExLhK5uwB6IrkzuMikF049XrflES1STFstiH6wnsgHDddzgf0u1TOoXeBc5nXFzWYnUL5G2RZyjvrvR7LMso7oq/Uol90aB7f64q4nOR+0J03y8ZTMWcntyHEHKdzuJfK+k8129B5KHs9Oo8I3+A8tz2hHHJ8j6DqqDLqU9HP56kzyO0cUD/okAjtghQ35xL3QUHM80zptRL+q3Tu+sLlpfoCUaZivFUV2Y0j7mejJ8roflb1Yb7nnJZ2jpvcPXN/eehWvi964Y3mPUgtHDch7pXYe5OeDQDae8OI66LmYhz3XdrsTuK+1V/cRMSHAPgCAP909TkA/CkAP76q8noAf/YOjmvMRuOYN7uI497sIo57s2s45s0u4rg3207bpVLfDeAb8IHf+bwQwPVSyrOPeB8D8MFqw4j42oj4zYj4zUk5VlWM2UTOJ+YXjnmzVZxL3I8c92a7cNybXeNcYn7smDfbhef2ZqtZ++AmIr4QwFOllN86ywFKKT9QSnllKeWVvch/FmjMpnGuMV855s12cJ5xP3Dcmy3BcW92jfOM+b5j3mwJntub+4E2i5g/A8AXR8SfATDAck3g9wB4MCI6q6eUHwLgvXevmcZcKI55s4s47s0u4rg3u4Zj3uwijnuz9ax9cFNK+WYA3wwAEfFqAH+7lPKaiPjfAHwpgDcBeC2An2pzwIoUPOQiQ08IQut9IXPaJxncsJ/qJPMxkKRMRQiJYiDMZlQvhGC39LJkthyTZHGWBWJzco8t5rnd41GWK41ImjaZZeHTdJHL2sgEB0KQuaCvV07EOVCSK7oOZSqEii0crIs1Arzz4jxjPgD0SU68R8Lb3lBI5YYtJMNCGFeURI7Ew2UgxMe1SAWLprg1Do/y8a7cSmXTp5qBcnQ9H+/acbPs5jTH94mSbZfnlsEBwJ4Qvh6QdHDYzX1V5Z4Oydgq4biMjpCns3is5aJU7gZzZSS9S5x3rmf6JGcLNfosxPdlOXElxIzTfD2ZciWLiOdXsuiYZcQ3bmWZ90TI9ZiOMGTWFYknhbyQRcQA0NtvlnX2hYh4uF48HGzEAwAhlE8y4hZiRADAcfP7VeK7sKAZ0JLDi+K8457dqWoaktoghKuxWF+nCBNyEcMJU6eXJuTrMhMS5bF42cFElDHcF4Ynud/NT3Ifrlm+rMY3FhEDAMv9zyonbiOnBBDUhhjk43WF+LbLMtNgOfHd4Vxjvqx3OIfq8z0xr+dcJPJOtBBGVwsxNxWXsh6TnLifr1Gfxx8A3Vnzeqs59IjGiEPRn2KU71sG15t/yTF86maqU1/P866YNPtPUWPpWVFJjOSu6ImYH+TzMqQxr89C6rs4FtztuT0Prx0xp1TicuxR/tgT83+VwwrPqXKdIk4olyg5sX6xAO1bdMUZjQcjMY/nl4wAwJjuS3muDwA3TnJ/KUd0X3KcX5iSxgMAwf1D3YSqPsRlYkyqxOOIAd2XdFi8fweB3/p14IJvBPD1EfFOLNcI/s/PY1/GbAOOebOLOO7NLuK4N7uGY97sIo57szXcyevAUUp5C4C3rP79LgCfev5NMmZzcMybXcRxb3YRx73ZNRzzZhdx3Jtt5fn8xY0xxhhjjDHGGGOMuYvc0V/cPF8CgZrWcfEa375YBxzDvG4v9mkRmXKCqPXQvB+5hk0s3OO1zmLdq1rjiaq53i6EFwZoHm88ypflaJS/381xs4zX1ALAtMX68z21DlOs2WXHzeJY+GzEuuXCTZiJfQuvT6pDm12Q8uZ5EYi0lnGP/AK9fXEe1bp9jmcV32otMpcpn40gbt5oFjxxJdWZPZbXWh8/0dz/tcNs3785bcaucieoy9sjV8KecIRc6uS++UCv2Q+Hwkel1rfXveb+675aC5zbmfwtwkXRZknrQp6F7aRL0o5gwRkAsNMCAKZ0XdRaZCUR4px94yRVmV7P5/fwqLke+rrwEKj11zXlzIHIq11a56zcDxxzQHba1JfEumo1TrJrQ/lsanHu2C2hHDdtXBOD3M+U16e6T+K8AJhvwcDE7i4AGFDeVOlJ+QrYOKXMGuzP2TvKjpvBoXCJjKgPqfmacj/0yevWaTnVpf2HcARK6Hixl4/X6+fv3KPz0ieJWtw1y83dhaNEeq3YowWRr9rmHZ7jiDqViJ3OkHyDwl3Z5xgU9arIkwAeI5TXQ3mkukfNdu4/kZ0dvafzq6jrIxrfLh2kOsmTCLQTTCrIpxL9vO96qBw3zXPXp0u+LRFfIdCjOTjPT3s95VAV4zSfu764n23jmRPzJ3aMAkChMSqEX0w6CPlw4p5zTHF+LOoczsQ4QveAk0Vu96FwYab70LHwHY5y7kWv1RdcX0dM5KtBLhvS+Pp84t5/cWOMMcYYY4wxxhizofjBjTHGGGOMMcYYY8yG4gc3xhhjjDHGGGOMMRuKH9wYY4wxxhhjjDHGbCgXLCdGkhMPapKzCUFo9YAQag1JGLmXBZJSWHlesPgSQLAcDMiyqCqLxqaj5jk5Osliqisng1R2fdKsp+RnCyE/65Mccl/IXGshkCyz5r4WYyGcE56zir5OEV5n5Udr4b7ceCKADsX8Xt08AfW+0FJ1RddMAr6WJ43LxHYxZsUkEE883fg8f1eWEx8/mg935ep+4/M1IXdlyaVq9kDE4IDkb5e6WUT2gJBA7g+aZSrPdAa5T3f6JIVVaaYrJIvUFYsQcisBOHM/yYk7dO1kehaBUEZ0jZWAW0FS48VRjpXZSW7ETYpXzrOAlhOzmLAI3VyvXi+7q2oh1hw291XtC8HhQR4no095RAkOO0LASsJiKTgU14prRT+Pdx0hbWZPdY37Q9KqUP0+pGie6ohz0CY7KAm6ijF+McRAxeo0j0s875gKqSQzOBqmsr0bOW/3D5t9tpqKeZfYf+lRX1BSVgXJKIuYmIQcrJr7j2E+XmeQx1ge43okWm4jsL/nBFBTfuAYV/Gmxk106furF35IOXGLvComnoUkw0oM3xUvTOGxrBYTXx7ypdhblFVozvUPbuynOg++72oqS3LiiZC0qlzfYn4o4TFByF7V3HaPJa20n2orgn759Yc0ng7q5jlXc8rYy/dynD/SZ0BL2Bkxtqr5UvB9aVe9WEdJjZufpyJ+j2fNOLglRMQ3prmM39szEOPI0SzHGN+HpvkigJiKvsCoeWWb+yl1fsVLIFj+z252y4mNMcYYY4wxxhhj7gP84MYYY4wxxhhjjDFmQ/GDG2OMMcYYY4wxxpgNxQ9ujDHGGGOMMcYYYzaUi5UTB9Alkc+gIjnxvhALDQ/yzlje1M8CSUjhH1sQ8ykoSuDFbZoJCZSSR904bu57lGVHJ4dNGeYzR3upzhOjLLS6NmkebyJkTt0qH++FJFbbE/K1Smy3mJOceCIkmmI7lhorETFLrxTbqGkNAB2KuSFJH6s9oaVqI5ETMRiTLHgs/WZ8KRExrl/P2/3RE43Poz/MotErTz2Qyp45bsbv4TSL1qaLZt9UccoiYgA4oFh9oJfbxCJiANjba5b1hjnmu3v5eDU5NKu+EpGt14pVQk6sBOD3Mx1xjRMszQOSZFiiJHIkniyj3F8WQpI3WTT73nUhZFVyYiXTznWa32Uu5H5K2swxJkXEl7I5O/pUT+UVJeVrIUIMkcj5KsRePnfdbr4OfYqNbpITby9BZ0VKudUXTNdFCF7Z6gwgOnQ85bnv5mvHcmLOtQDQm+S4OyT5pBKuzkuzEd1QcuI899t/5kbjc31TSPTFiyLSSe60nOrynFGMsaWnRLs8H83nSY0veywnrprt3IbfrAaALjW0y3JiEW8xyNcklQnhrXy5QhthvRgjeFzujIWc+EiU8RxOHI7HiJGYn49FGfeVveN8P/DIUzdSWf/GUeNzvCTPjeS9Dcd8GyGrQowZMcxl+/RCCfZPb0uurwLYI8PsAcmBVZ9X4vJ0/6ruZ1vcl8rrVAsxL+c1JQFXu6f50ljIgo/mzX3dFHOs63mKnuTEInQwXuR9LXhfar44EWUc92JO1ybuVe4JTohQ8n9qzh0E/jaMC8YYY4wxxhhjjDE7iR/cGGOMMcYYY4wxxmwofnBjjDHGGGOMMcYYs6FcrOMG2fex12mu++rtC0/Afl67n9YAqvV/vO4YQOG1zqIOBmJ9IblwylS4eE6EO+S4WW9yNVe5erO5hvXxk+yzefwkX6pb5I5Ra+QeEuuxL9Nau2FXrIEUKDfN3WRBaw7bLLPdNAJAHc8d81W/3fpSzGmdpohB1Q/i5KTxucyE0+iJJ1PZ7J3NYL3y2H6q877DXHZ10uw/U7GOm5YGS5/NJRGXD/SbC1oPBnkdN/tsAKC331xA2xms99kAQDUgt0hfOEl6LZ5/K8dNJ7eBz8s2k3RiQd9XnLYiOnmw90bUKcqNMybHjfAXtHEjsMMDAEZz5bhZn6/6dXO8uSz8OSrPsstErZOPSyKA0zjZ8nc1yg/HKNcEf+aF3AA6g9yve+y4CXbcbE/H4JDqxHrHTYjrkvKKGn9VrHTYLyJyjyjr9Jr9ZU/k3706z8Wu0/c9VF2R3AQROX73hNvvgaebc6r+M3mOVR3nMSDRwtm03FkbV4r4guRiib08h6z3874POuw9IB/dFoR9FUCPzluf3D2dvsjrIjewGyhaOm4KXd9Wzhtkx011LOYFys9DfVp1TXbcHIsx42iWy0bkCBnUOZauXc195fKN5jwvxkIk0hf3UuyeU/HdBjX3FNd4r9/MK8/H9XEvqSKwTxO2B7rNc965JPwn6n52SGXiOrXzE4lYVbmPPTAt5wVT8qoeCX/ljWmzztVJPgfXhB/1hPritJu3U3Oqwv1qIpxnyoPGnh/pFRV9gRuh5krinmCwJu7vJNf7L26MMcYYY4wxxhhjNhQ/uDHGGGOMMcYYY4zZUPzgxhhjjDHGGGOMMWZD8YMbY4wxxhhjjDHGmA3lYuXEAXTpUdFBh6ShSuYkRG/okRRJiYi5jqo3zELHIsrQa7Yhrl3LdQ6PU9HsiWbZtSezVOw9tw4anx8f5XZfEYIn9nE+KE7TQ70sZbrca0qSup1cp66VyDPvvxW0XVsHUxVbaCMWkFcUQ5JDK5GVhGRaMcnyyDZnLI6OcuHjT6eik0ebMfDeGw+kOk+Mskh7NCcRpWjVAYl5u0JOvMfnCVlGvL+fBXz9S3m7zj5JCIc5CquBEIRSwpJCRWUUJoFZTISIWMiJa4r5zn30bL1mCaKiiDp0LqWIeJpzWCFJXRGC6BCXc1A342cs5NrXp0K4TaLJWcl1+nQOHhznpP2CkWgUnxcl7dzPfRFDKjur+VFZAVuI+5REubuXx8k9GoP6SU68HSgZPcd91OJcqjGgjTBSybz5GigxupDFdknCOuzl8YVlugDQr5rXeFFyu0+oe85KjvFu5Pi9dO1S4/MDjz+T6tQfmeNJivsZJZXkkFY5S23H80qWggOo9vN2B3SOhzSWVFtgJw5kMfugbl7weijitJ9zWAx4Xt/uFiVYPqr6jsp91FcqDlRouTfvai5inseNYyEivinClGt1q9xXrh7le5QPvXG98blWL0vh8QDQUlamjbBYCdaH+fqdp6T1XlIFcEDh+gDNT+vLIn5ZRAyk+1l576okwy2uXRH5KomrRZ0iBMKTSfP73Jjkdl6dNPd1ZZz3c3WU+9kx9eFaCOxVF04vc5BzlRZlZ5Vyi0apF5b0es2xc4/mAVWru7dn6xpjjDHGGGOMMcaYjcQPbowxxhhjjDHGGGM2FD+4McYYY4wxxhhjjNlQ/ODGGGOMMcYYY4wxZkO5WDkxgC6JfPY7TVGVErgp8TALgZSACbX4eiyB6gtR1P5+LmNu3UpF5d1ZnHf0rmY7H716OdV59LgpsntqlGVHwm2Ky3RaHu5n4dOL++NUttdtnvOekhN3hJCNZEohTm+wiRdZaqwUTNsiJLtTIoAOxWqPxH1KZCVFWZMshkzHm4s6MyoT4sbyzM1UduOZpgDv8ZMstntylIOAW84SLgAYkFGsI0TUfSHCHAxJbPeC/F26Dwjx8B7JTvtC2NYToje6NlG3lIi2kBPXvfz9eiRprrf02XpElnLX0fxuUnauEgFL5ITAWImHU5noUqoNeyxvF7F5JESTc9r/REiNO5Q0H+jm8edFR3m82x81RZMswAUghajYF6L9NrQR9yUroNhumNvUyX5+7FFOHNTN7bZB0gosw7dH+Z7F65W4TGoMSPJWJVhsQTVXfUPI0knM2hdy+KHKyfQig1p0qtG8eU6O5FCWx5KDTnMu9qL3ZRHx8Jk8F6vGzXlPUbFatZj+yu1yLPL8M4Q8vGKTKYD9XlMSyqLWbcj+VUSSKu/THFO9DADqpSN9OkdKwq5YUD0hcg0po6ZxWtiCqzrPj7krTkWuP6aXNNwSMX9diFvnNL6p/nR1nMeNBXWqepS/S8yExJ/Pi8j10UbcqiS4AyEnHjb75vB5SFrvJXUUXCJx9cFe87vFA+LedU/cc/LYre552wqLGRX3JydrN1uI2DwaNdt5fZqv75Vxsy88I0TET07Fi3xogvbCIl5s0OKFNaWFsF+i6rR5mYOSE3eFfJ9iY7/D4+b6Q73/kO2rGmOMMcYYY4wxxpiLxA9ujDHGGGOMMcYYYzYUP7gxxhhjjDHGGGOM2VAu1nETgR4t5BrSOmq1Dliuc+V1n2odn1qfxt6bXl5nWzr5eEFrAuPdT6Q6o3f8/+29aYwsWXqe936Re2Ytd+3b3dM93cPZyKFIDoctmoIsL6QJUDTgoWHCEgURBDwwDUOGJVg/NLABwwIMmPoj/rFggwCJGQKCqIUySBgiDJogTQgwhmxR3JpDsnuWXu++1K1bW1ZlHv+4NfA93/fernPjZuWNqHwfoDEdZ05Gnoh4z4mT0XWeiGutv/n+5Wz7T7fjAv93d/O2M5/NObIc+MVRvnbw+eE01Nnox3Wu40Ferz+Ii287g9iIyq3nrJh6qGT9PvFReH8O8HANaVanHZqDDENcuxjcAezA2HpL76Zh6++nrB+4XOxF71Ha2g9lD/ZyP8ZV4rO5dUDWd7rtQ5KToeuvRynup9eJxzcY5+eudy5+rnM+fqGN87azNaj0Onh/TZd8jvk33Dp1O4zrfLuj2F8HVf65nhWsYW4o3sPScceGbmGH9tclnkqO60NUV0HGnZEbM8/1yJp/8t887rmBm3lw/H8rWe/G9e6XH0Qvzbmt/P7TO4jjOstmcLix/LKxxruy2Lpx784CgKHLPfFYVGvx3E2cO2XQyX1abfkvTAbAq7K806walK2JDzti31fzpljNY366B3l+B0REM2SOG+/wIU06dF3o/jTmiXlChm6ScfneRqjz3PtxLjbYcQ6Hmn4gCptr+n7VI3PICXHcuDnbxH2sDXOeygB3e8XYuXuqCXHOeJ8NAAy966PmTxT2m4GMfd7dUo3j3MhI5pObr+zP4r4fuPH/Hsn83YN4MztM3n0Rz9P9I+IWfOA6GXEZhnEdgNH7lN95Qf9hvhVyHXrj/Ji9A7ENmQcezuvPud9E440897YenabMRZe8v4b5bIj3JnyO+JCM/J5FZzvfJu6jo514Ie4f5G2/NY3X/OZ+fk6uTXdCnRvV9VDWS/m+DXGs9744IB5y3XticfB8PfY5cu/ujfO2r3VPvm8+tgnlVYUQQgghhBBCCCHEMtGDGyGEEEIIIYQQQoiGogc3QgghhBBCCCGEEA1FD26EEEIIIYQQQgghGspy5cQAek7AM3EiSBsxkVKBoHNOzJM18cIyALBbt/Kv+7MoxLv65noo+4O7uWDpaw/is7I954W6GH2VeH4Y23RlkJ+7C4MoVtscRenseJwLtHojIk4l39dxzsxqSCSLXkQMwHreHkXEx/1Y1nVy4pY4ywLeb9vvuvNNhGLUpHo0//Dtx+HzvBeluGmXSPLmebtuExHxtd0orfOXm0onXZ++NC97htwdOXHfZhS2VRej3BUjJz5jJjAmnQx12OdImb82IyIAJ80cu2z0q6UO0QvDAHSC1zk/NvPWbgDmOwsQzy+RQbPrmVyCZICnAAAgAElEQVSZMcd9N+a338+v1aVB7C/rRJp5dTffvjeN13yW8s+NiTjwYn8Syi7fysX3wy0i0WQCyaG7mbB7KR1rXD0iL/Tnl7ZhFG9m1Xrss+tOZjp24uq2CCsrMwxdrgdObmrkvokhkdkyeasjkTEr9AXSXyqSlc40n094iShAxPogLxEg7fRy4ge+AMAD4lKtkOfwYj8Omp9+P2Z6sO0645TsnMg+FwaTixJR92iSS5THXS9qXaBU+ZSoDFhz8Z048X61Qc7HiLzJwotbS15MwmBjGrvefm7Ujy8YYUzd+Lg7i23acreNrYPYpttHe6HsAHlWOwfxd8XuUfy+ub8lsPkhGcfDC1voyzLq/b5i0vXuJM/0xL2Eoi1/TdCxhHNuPBxcyI/F1skkj8iJwzUg9+kgIgaAQS7xZ3NYNoL4e0TajePj/v3Y9+4c5Pdz9nKSG+73xbXqg1Dn3jyWbVTPZ9s9ksOef8EFAPMvmCh5yQirx+b/JbkvlHJ3Jvn3rbt5gb+Pfhht6SNCCCGEEEIIIYQQK4ce3AghhBBCCCGEEEI0lBMf3JjZ0Mx+x8z+wMzeMLO/f1z+MTP7ipm9ZWb/1MzI338J0U6Ue7FqKPNiFVHuxaqhzItVRLkXZ4ESgcIBgB9MKT0wsx6Af21mvwbgvwPwsymlXzKz/x3AFwD8bx+2IwPQd8vBRkO3EHTo1uw9DraG1cPW/Ps1a0dxzTb24rpTeydfk/fgjegY+ONbV0LZG1v5Ad/aj+0+P8ifn230Yrsv9GM7vdPm/Dj6bNbXYtlgLd+XX3MKANWArIt3a/PNC4vAHTd+fSFbolz1iGencmtfT166v0gWknszQ8c1tNN162CJ54Jm95Cs0y/5nFvrnHZiJhJZD913TpId0lWu78U2+eOdzuPxeQ/ElUFcJzojbpzKVas2o0PDLq7FhhLXRoCOFzUdAz13PonvpDOJHWHUcWumq6XOHxY31puh7zpst+Nzf/JYASB0fOZySYmsfXYeACNejYqMtT137c71o+PmPHFtDFymbxzEa77vXFLdKubyXC+WPX8n9xxsvn87fv93xn7tz13qxzwxpxuMdPYCUt95ych6/moS1+pP3DxgEhw3pzrYLyz3lQFDP8dxHr9qRNbEM5/N8GQHi3XJvrxXgqy3p33P9avedhzbg58NcW3+ERkyD2Z54TaZd+3PY9kc+XzwwiAey83bcbw/v+UcN+zeyXJf4jlj+EkN8R4Ycbr0N/JjnnRO9gUtiIVlvoOEdTenGU2cu3JC7slDcm/zWSVemsTmSyUSrEHMrjnnC3OypKO47/2jvA3bxDmzNc2v5e1p/M1wvboRyqbIf38Mjl4JdQ5T9KDN/eExn00JpXMeX49dgwLXx5obU57E9VGDheW+awkX3NjePecH/3gvp64aP46zjPdIf/H9g/6WONl1lLyQCcD97TjHuT3Nv+/mfrxWH8zv5p9J3wh1Do7uh7LJ4GK27Z8VAEC/ipkOU2T2Qeah8eec+ivJ53y/Yp45Mo5UE/8737msFum4SQ/5lrGrd/xPAvCDAP7FcfmXAfxY8bcK0XCUe7FqKPNiFVHuxaqhzItVRLkXZ4GiB/pm1jGz3wdwA8CvA/gagHsppW/954L3AHzkdJooxLNBuRerhjIvVhHlXqwayrxYRZR70XaKHtyklGYppc8CeAnA9wP49tIvMLOfNrPXzez13flOzWYKsXzq5v7RzO/NlHnRHhY11iv3ok0sKvc7yr1oCYvK/IPZ7skfEKIhLCr3W4dRqSHEMniiJbQppXsAfhPAXwJwzsy+taDuJQDvP+YzP5dSei2l9Nq4iusyhWg6T5r7RzM/6ijzon087Viv3Is28rS5nyj3omU8bebXOuMltVSIxfG0ud/sRQeMEMvgRDmxmV0GcJhSumdmIwA/DOAf4GHgfxzALwH4KQC/cvK+gJ57VNTvO9FPr8SXjCDG8pIxAEhdIlh0kjo7iMIwJidO7+YSsXffOR/q/NFWFFF9/b4XEEUB0kUnJ2Z+33VyLOdHuYxycyO2e3g+Svm67j5bjZlcqUA8TASH1iWCJ1+PyN6qQTy+gZPj9rykNH7TwlhU7g0x891uTbF2SR3WDw5d2bRMWrc+yvtGh5zwG/Pt2ATk13J3dyPUGXRy6eTzw9jv9w6JmNCfOvI5XNiMZV6SyuTmTObny9g5Z/vy49NhzDeTlE6c7G7QOUU9pWOhYz0A75sOYtMCkTmAImEoHQuGTvRJrKmdEZETj/N2rg2iuO8CkamvuXvXjOTiNh5k2+lBzOp6Lwr6rwxyOfGVd2O/e+7ug1AW8kokfYmJVOOeyvAiRCYgXYv3yfE4P56R69Yl7tG6LDL3FYCJa/tw5OYca3FcMyYi9uJJdhKIXNtfA5uRewIZV8wJ6juTOGZ5wTjwUBDxKEcptnPX7XtrHkXaW3YvlO1N8/5xbif2l+s78cHBJ7dyQWa1H+d5aZ08ZCu4NRfBxiwioO6ueVFrfjbZPXcRLDLzHQM2ndB9sOmkvxPycgAiLveZpyJXIiwOUlbWV9j93c//yeeOprFsx8mJ7x3G6333IP++63Yn1Lk9fzuUzVLepgsWX3oyJ3JikJc5LBWWefJ7rnID5LqTtFanKCdeZO67VcKFYX6tqgsu5+ylGEwo78oSrRPPZXjZABPlsutykM9pDm/F34l3di+EslvTfF+39mKfulm9m20/2L0a6iQyN6rchHFA+mKvip8Lv1XZMwQiyS561sDm+/5jrA57IcDY5d699OJJcl/ylOQFAF82sw4ezkv+WUrp/zSzPwHwS2b2PwP4twB+vvhbhWg+yr1YNZR5sYoo92LVUObFKqLci9Zz4oOblNIfAvheUv51PFwfKMSZQ7kXq4YyL1YR5V6sGsq8WEWUe3EWWN7f4QshhBBCCCGEEEKIJ0IPboQQQgghhBBCCCEaSqEJeDEYAO+u7Q6dxIzJKRlegjiLIj0jUrFkBfvfi+K8+dVc/Pj29guhzlv3ozjp3VkuJLuA9VBnd+bEVMRRNOxECdTGWt7O8XNERHw+Hq+XolqfibCI6MzLooho2ZgUzpcRMWI1jgLQvjvm0xL1nSaG6GDtDNy1LM68CwYTER+dLN2ldQijSZ6n54nI9dDidbuKt7Ltbbsc6gx3vs3tO4oK7+xHsdt0Jz9XIyYGm0Tbf5o4gSUTFR7G/mNTV0ZEn2EsYvsnIkZbi8OvlxOPWT9sAZUBQy8ndgJyLmQlUjc3fiQy7jCpJB2L/MdIfnp7eTsnw5jxzV6836y7tvcsjqvblktTdxGFwsOtj4ayiy4/z1+PcvxLH2yFMvNS1o0oCmd4OaKxjDOBoq/XIdeTiEqHa/l5WS/w8jaRyhImTjA7GLvcj8jbSJio1fePkrkLg4ggjQleXV+oJnEeVBE58dzJiPfJELnjxsO7RNR6Fx+EsgdVLiw+vxvf3Hud3Cfm7qUQFR23yb2DRLoWLLBE1N1Zz6/pxAncT1PUuig6lnDOjYdh3skkrUTgGWTELKeDuK8gaSXCdXbvtm03/pK50XQvtnPLvTjhXrxF4PY0H3vv2HuhzvYBfXlRxuEwzkuKxkMmpaVlRTuLReylDB5yj7BxXublxJ0WZB4AOtUc58b5C2Fs043tTK5N7olhbGdjPcu03xe7vuzevb2bbe5ei226RcbVu+439e2j+EKc+/N8HD84jNL5qiJjoXscwX6W9sn9pxq7l9aMyb2U3V/ZtfHQF5a4bTYPYi98cG9cCC9/IeLlx6G/uBFCCCGEEEIIIYRoKHpwI4QQQgghhBBCCNFQ9OBGCCGEEEIIIYQQoqEs13FjwMAt/eqO3LoutkaPraVka89K2uB3zbwWO7uhbLaVL2y7vh/Xx72/F9f7XbXc97GPF0Odtb2Xsu1X1+K+2brP8Wa+sLb/YvxcdX4YysLiwboCAbZGvGRfZB1x5YMBYODWTfed5MaY66JhmAE977hxDoQmCByYW6rn3Awvj2JfOZ+iM+Nrs9vZ9g5uxn138/Wzz++8GupcIy6M+3fyNcQbWwehDl27Opnk20fRUYKDuK/kxiNjn2NjkR/H2Pr6SVx3OxrmbRi11XEDYOTHeu8zG0TXhxHvgXdAGXM0zYkvoePcIiTjFel73cN8/+NbUWAw7sYcDHw/J+PTFPk9YncevR5fs3gs57dezrafG6yFOt/9zvVQNnT3ssTWu3s/BBDXxdO18yc7FIKzAoAR30V/I/++Scf5VtAS74EB6938WPpr7lwSn1fw2QBxXX6pn6LEhTMi45G75ja8f/J+AOy7HOyQIfL+Ud6Htixm9f40OkA6VZ6Va53nQ517h9Ghlvbc8ZXOF8O4Xe4dyL6fXCsj3oPKzfXW3bjSgKnBiXSrhHP9/PpWmy7PY+K4Yf4a7+wg40fw2QDRe8PmAN5XByB18++b78Q697fjHPr+Yf65e9M4Pt223Dm2dfhuqLM3jXOjTkXm7A42HpobM6k7kWTQnwPmRLF5vd9b1D03yq/N2sBlp2rHWF91EtY38vmaTTbzSizj1ANaffj2k5R5yJw13c3dTrfvTEKd29PY9jsH+bW5Y9Grtz/NfXXzefxdXJE5TuUEY8xp2qtiDr2zlfq0RqRPeTcN+z1bAns+Qd1O+fkcj3ey7SfJvf7iRgghhBBCCCGEEKKh6MGNEEIIIYQQQgghREPRgxshhBBCCCGEEEKIhqIHN0IIIYQQQgghhBANZblyYiR0nWS38v4jJm6i0qCasiy3L+p+2yOSUud32p3FZ153Lcr87h18M9s+6MU6a07wenP/YmzSLF6qzsCdy49EUaxdWA9l4RwzcR+RqQapMLsuRGyWfD0vUQNgwyhzGvbzk+4lvy3w9sEA9L13rO8lcvHYi/oBlZWdLIxmktbkGwmgu57v68XRfqjz0XGUpP7BTi6dvbP7ZqjzrnOFfe3Bc6HOK2tRmPbyvTzjl795NdQZkjwnLy9k8rBQEkklYjkA5n22TFJHJKWjSS6Nmyx1hF4clSWMXT/vjd3YQIWsTObnrb9lwlDz+2JjWo+Mq66fDa7F3A87cV/MBemZplwW/GAa8zvrxfvPm7vnsu3ntjdDnbvvRAHfCztODMhEegwnrExMrl2yH9ZfvHQXQGczP3le8MtEhU2ksoT1bn6uuptu/B0TuSobH3wZGbOCWBSIAlJ2fyFjpDl5q5F7wuFh3NfuUV5v+zDeg+4hH9e2j67F/RxEYXFV5efq9lqUeT84iveO+b5rA5NyLxt2z5nk13ji5MTspRRNo2NznHNS/WrdZZyMszS7frzwsmKA9xV3f2cCYzaE+JcNzG5GEf2tnfOh7M40z/z9aczXluUvafDSVgCYz3dCmRe3dlLMDRsPK3/I5JyXzTXZvJL0Hz+EFM6NMMzbNRnm99c2ZB54KCcennc/DL0Yt65dvK6ImGDspRu38vH4+oMLoc6tafy+LZfzbZdxADic+UyX/VbvJJd7cuo65PdN+O1I5MRpSITF/j5Zd47D7i1dsi833x+s5WJnk5xYCCGEEEIIIYQQov3owY0QQgghhBBCCCFEQ9GDGyGEEEIIIYQQQoiGogc3QgghhBBCCCGEEA1lyXLiKJgNcmIGk+eWSJ+YPLfkc9OjUFQN888xgdYBosRyb3oz294/jIKyq+uXs+1b+1GGdmM/ytam27lcaTwhAqbno+g4NjK2GwdR0hbOCzlPRYInLzkGgFGM4tAJ74LktwXCysoShk7S2vGXqcNEZEz05qXS8TwaE1ie1EgAFekr3c38+j63thvqvDSJQuzN/Y9k27fTV0Od7b13su0/33gj7nvrtVB2ZTDOtl/8WpRvf2w7Cv+SF7sFkx+RaAMwL3OlonSCF5almG8mKe2t5f1nRFyCbaAyYORy311zklYmIu4zYeXpdXwjIjtPd20vlLHx33fHQyICns5zKeD+NMr9pkfboezttXwcf3H7+0KdD+7EvvjCtuuz9J5Y8N9vSsWTvsxIHXKNq3Uvac37QdUSYWXHEOTE1bo7XiJnprl3Y3nqFwiMgSBq9aJpAFyo6OYB6Sie8x0yD9k6ytv54JCIWisnat2/E+oczWLubZ4f3+48zp/2ZzGbqcSHWZLpOesbNV+MwcSwTtS63s/nXW3IfadK2Bi7OeTEvViAZZedf59VNsawPPsyJjVmY5Gb5+68F6/Rtf0ofb93mLf9wWHMxG7Kszqbk3k2m525dvYRz12PSVp77nySMYWOIf5cGXvBCJlrhvNZ9jvN3/dHk7zfG3l5SROxThTP+3Me5p2nzYz8JtuL85fZzfy31Y2DOK7fncZrd3+aX+PDFPedcLII3ozMAdzfkZSmwAZuX6PYX2mZ5yheK5p7X9Zl4m4y1rts9Dbdi5KeYK6vv7gRQgghhBBCCCGEaCh6cCOEEEIIIYQQQgjRUPTgRgghhBBCCCGEEKKhLN9x49bsWr+mq8bDPDjs6PyaZeIhYFSTfAHapUH8vh6iLyGlfM3hbHY/1Nk6fC/bvo3vCnXYGsQPrm1m25t3o9sDn92MZR6y7tV2yXpc78Jha5SPyEI9dm1CG+LnusP8c0NXpQWKGxiAgVd0DJzrg619Z+uxPV4YBdA8mz+3R2Ttcye2oXLrtjc34nrWy4PYNy/Mr2Tb3yDrWY+O8vXft/ffDHXenH8qft/2ufy7bkaH08euRX8Cvt2dlz7xTByR9cF+/XeXZJmsg01uzb2xPkBcF94Ds9Ztx3pvTwVgza397ay5vDLHDXN2+P5R6lvxmWZ16Brm/JxX45inWYptOHC72k3RE3bgxv/Z7EGoQzRhuHvwjWz77fnHQ50P9tZC2ed2csdNWJ8NIFFnUIGrpgR2zsk1rtbzvrDm+lmnDYM9HrqPNp2nxNbc8TLHDXFy+DGkyGcDIA1d2YCs72eOm/5WXmX7MFS5tjMOZbcP8ovjPQhA9H0czqIvjToyXD+bpYNQhah4IiyHJNPeSVEcO3ffZf2M4X0f40F+j22D46bqzDHezK+LrV1wlep1YOoIIWWhr7DPsbn+Vj7+Xr8ZnXnX92PfvONi+GAex/oZXP8heTPyI6XXyfvYgDhu6IjtPJx0nKH3V9eGaez3RR40RoHjrO+8fhXx9zSSjkV/GTu/i4KNKa7M2ByWOEwP7+bn+OZBzOE9ojndn+f7n1scsys33zeL958OcUyGNpLDPWTOMff7Jo3J/Y7cJyPx3kJdNX4uXzL3BIBefl46E3eveYIupr+4EUIIIYQQQgghhGgoenAjhBBCCCGEEEII0VD04EYIIYQQQgghhBCioejBjRBCCCGEEEIIIURDWa6c2KJk0LolcmImeit45sSkxlWBNK4b911t5nKj54dR+LSRohyyqnJR0nwepXwHh7kU8FYnCiuv7UcJ61tbG9n2t73xzVBn8B+GIqS1XMDGrgDTg1mRyJkYrUogotLeMG9F3/syWyCsrAwYdpyQ20vkSN6CkLX4C0mXLhAD2uhkedfw/K1QNunGTEyQZ75bRVnYkUvY/vR2qPPO4E9D2cV7n3PfHyVn//E7V0OZHTrhnhd4AlHSByA5U6zNiPyNiYd9X2HXsx+/zwt8R52WiPoclSVMnGDWJu54h0TkR85JkL8R8VsigvUgCmR1CCErpHtuH8Z9eZnffdsOdaZHeVkCyRPB3yNuDN4LdW4eRKk9dpxwr1Caeqowmd8478eTbn5eKnpHah4dm2Nj4OTEEzdGsbGAjdE+52x8YpJ1LyNmYkY2jrlsTK/Fc/7NnTiW3yoQtc4t71NeYAlwUau5ewf7XMm7K4qF5iUssg+58W40zM9dVTJffcZYBxhsunb6sbe23Jxdt5oTP3KfTnfzufY723EOf3U/tn1rmh/vPpn3diw/B/1OFB+z2XK/m9frkBsQnZ/33Hlh9zsyhoTzWXp+6/YfN65119z8uCV/TmCVRfF8ybljA5YfUwpExADiPJPIiW0/SnenO/lJvjONJ/2ef9sCgAM3X/EZB2J+Gb3u5MQ6u8yzfEjy63+DEEF0YvfAEqE8GzP8vJbdS1nfcPd9/8KjJ3kDQ0u6iBBCCCGEEEIIIcTqoQc3QgghhBBCCCGEEA1FD26EEEIIIYQQQgghGooe3AghhBBCCCGEEEI0lKXKiQGga07M5B8dUXETK3PSICb8Y7KhytVjJqxeLLPz42z7ytpOqHOhEwXCw975bHuXiPvMteF+dS/UeX/nfCj7cycm/PQb50KdT+1EGTIu5O1MXmYIwKaHoSxIn5iUdcaug7t+5FoZEfR2RvnnBlW+3QZhZQVg6ASD1cBLqcg5Y8LisHNSh+7LSy7LxMf+mnTHUU48S1GoNXfXpSICMy+inKco+Lp/9EEoe6t3OW/TnY+GOgdfjzK20UEuE08bG6EOFfd52RsbL5iQznWNRK6VEYmaF/iuEflzG+gYsOYkbtXEHS85fprNTn5OqIh4wCStuZAuMSE1w42Z8wfxGry9G8fM686mt21RuJ28EM/ifoD4fcmVPZjfCHXuHcYcpoO8TVTARzNdM3clkkXSX8zJ6cdeTuznDQ2lqhImTjBrIydiJBln40OJlJuWuX7FBMZGrKj+nn/7g3Go86fb8fuu7uTX6gH2Qp0KeZtG/ThXMvLfESsn2++S/kKT4XdFhdCFY3kJfo5TZExGuH6DoRNftuA/rVoH6G66hjLJ/LNmGkOf7uZj/Qd7cV5wdTdey7tuXD3yN3wAPRtl25PBc7HOLPaxUTfvGx0SAjbvCnNodn9lZZ6KzOvr9gu6/3xf1Zof5xb3VadKZbCRlxPX7LBeMlwiIgZgfn46I9fOv2wBQDrK27lFfu5tTeOc/NDJifuI+R33LmXbvU4UEfeqUSjz3J/G492aknne3M332TyelflzXJGTUCK1Lx2k3T3Ihm77Cd6204LbghBCCCGEEEIIIcRqogc3QgghhBBCCCGEEA1FD26EEEIIIYQQQgghGspSF6IaHroPsrKStZNs3Z7/3Jzsh5V56Npn8rnNfJ3ehfN3QpWNflzDOjzcPLEJo96FbHuGuNbu6n5cN965l68TfHl0IdT59NZ2KEuvuOOjXpQYjeTKjK3nLHGAsPXf5DpUg/xzfee4WeCq21PDDBh03PH23Tmqu/6eXTfm//DOgyFZJ9qJ19vY/h03D2I779rdbNt7CgBg4PqKd38AwNEsZv6qvZFtz7qxr2xdI+vGvbOpdC2yr1fioiiFuT5G+bkadtrpuKksYdRxa6THLpss92T8SL5eYe6D02YUc0HHevd9+7djm/7wXiz72tH1bPsAD0KdQS+/H/S6cf33bEYEJI7pLDrWdo7IsZB14guDrcP3ZaRfU5zjZtTL1623ynGz5tbcD6N7boFfGMv8vZuM7aiivwB7uQfs3XvR9/Fn92I2b8zzOcaD6n6o410IF/ufCHV2utGh5u8LA1sLdRhBF7BIWQx1Lrqcz8j5ZU5AN/70xs4LVrUg9x1Dte4yVjKvLzmPxc5LP87E82/E9THfzvN8cxrvLe/uxnnIg5T38ZnF75sg91JOOtFTudO5G8p6yD1OMzLOHrDfNi7i4b4JlM1VSuczbPz3sPHf7b8auXYu0qdzmhiii9KdEyN9PnXJ2DB38xf2m5eNHz533nlTyM5h7FO359GPOnW/TYcpzl/Q+YjbjlXmxAllKa94lzh27kzJ7xs/HhT+ng3n6pTn9r7MBn7MfILd12iSEEIIIYQQQgghhFgCenAjhBBCCCGEEEII0VBOfHBjZi+b2W+a2Z+Y2Rtm9rePyy+Y2a+b2ZvH/xv/DlCIlqLci1VDmReriHIvVg1lXqwiyr04C5T8xc0RgL+bUvoMgB8A8LfM7DMAvgjgN1JKnwTwG8fbQpwVlHuxaijzYhVR7sWqocyLVUS5F63nRDlxSukqgKvH/75tZl8F8BEAnwfwHxxX+zKA3wLw9z5sXw/lxCkWPgoVHhbIqpi8kEnMSugRAdJmLsUbXYjipKE3LwOYdJ/70G0gSswYH1TXQtnd/Vz499HtF+IHd6JYLVAiwqWfW6BEjIla+3nZwMuJT9FhtqjcGxL6lROWDQtkbKzMCxaZfI5kN41y2R3Gw1hnEMt8XzyKrjL8yb0oGXt39gfZtpdvA4D18mMxJqUlYrvtg/ez7feOonz71v0fCWXPezFhqYisRE5cgLFxjezLnMB33CFCulNikWN9ZQnjXj5GmhPQ8twXXAOWeyZg9ZkeDEKVxK6B2757K0qNv7J1M5R9ff672fa4czHUOdd/Jf/+Qnnv7iwXtx6lKIk9JLtK0zw/VioL9vdO9jlW5gWKTKhYIKcf+Oy0YKwHgKqT0J+4Yy6QvLPxIZXIP+vKE9m+93Lh6rX9eE/4Kt4MZUdV/rlJijLmDVzOttkLGCYWPzdzEuUj8jkWDeu6UnKeWN8vyj05d0FCSnN/8vXsjE6YHy+Ihc7rK4tzGn8/LzyPUe4a59msX/j+Q2f+bF9Hec19ctnetQ9CWQ/5vWSURrFOyl8CcUSEyWNE2Xay/FgOyOfYWB9EueQ+Se93JeNMyW+pmr+3rJ+3005xsF9k7gGLY7s/B+zcsrHBZZPmnomH/TUunGd2h3kbOmQudre6HcrG8zyv4xTzO0zkJRAOn3EA2LX8ZQ63ZvEHx84sCvNxVHKfPHmuWTIXLKakL/j++gTf9kR3fTN7FcD3AvgKgCvHnQAArgG48iT7EqItKPdi1VDmxSqi3ItVQ5kXq4hyL9pK8YMbM1sD8MsA/k5KKXvfY0op4TEPuc3sp83sdTN7/T77T/ZCNJg6uVfmRZtZxFh/d1rwl35CNIhF5P6W+6sVIZrMIjJ/88E+qyJEY1lI7rc1xxHPhqIHN2bWw8OQ/+OU0r88Lr5uZi8c//8vALjBPptS+rmU0msppdc2uif/CZUQTaFu7pV50VYWNdaf78c/HReiqSwq95dGcTmeEE1kUZm/vEaWWR+t9nIAACAASURBVAvRUBaW+3XNccSz4UTHjT1ccPjzAL6aUvqHj/xfvwrgpwD8zPH//krJF56kRUlkbVhYPwyUre1mX+b3z+qwtaH93M/QvRi/ny1rGyFfk9dLcWI3J+v9SriBt/Pt/edjpbqenxJK91137WsvvzY9rxuptdfC715Q7isDBt5x0ytw3DxuZ9k2WbfP/B8uu2lEbjgj8oBpL/8vCgdbcbj4N9Ovh7KO9dx2vR8zZvFYNoYvZ9v3dr8R6tzaI8fnxhDqN2BtKKlH1+r7tc6FfaCXn2PvRzpNFjnWmyWMes5H4R9iUsdEzeNl+3J9IfX6sU4Btx/EvvGe/VEo806bCuQ+UuqYcXg32vZRdJ4VwXJY4J+g92BWNnNOHVqHrNV39LpuP8xhtyAWOsepgO66n2O4bJaMF0C8LqWekLq4a7U/i760KeJfkK6n6HLyMKdNCZ3k7jnkVunnBUD041GHXsm5K8j4wzKXafa5Q5J7d907o7ydRP22EBaaeTPYwF0nn1VyPoz425Kvx8YK5vrwjhB2PyD9x/p5vX7h+WZOm5PonvxzCwAwT95xE31mVIHovU51w1PgHgIQ+0HpPcLvK7T7w5v3NCz692zAHxsZK+yIzNu9g7FLstIn7tVpwb2FONa6k3zcmZCv6/qxF0DlfnXNUe/+Yymeg0nKfys/cM4bAJgn4rgp+F1E8XOc0tz7srr3Ze+4eYLcl4wkfxnATwL4IzP7/eOy/x4PA/7PzOwLAN4G8J+Xf60QjUe5F6uGMi9WEeVerBrKvFhFlHvRekreKvWv8fhnQT+02OYI0QyUe7FqKPNiFVHuxaqhzItVRLkXZ4HTXG0ihBBCCCGEEEIIIZ4CPbgRQgghhBBCCCGEaChltqwFcqJ/ZxalPok9X5o7eSHbV1Ugy6LyLCIKHDjh6uVo0t+fxc91kH+uroiYsWa5FHDnkLR7UiBRowI4JtVy9UqEZUA8n+ycE8zJmzqnKKg8LQxAr3Lt9lKqujBDXYGkFUzSOiAC4V6e3Z0Hsc6d+Z+Fsroy4hLMCV9Hg0uhzoOjKGML4rFSMa4vY2JEKlR39VgfI9/nMz/oLE9OvEgqSxj03DH73LPzTYXyCzoHpdI6x95R2W2SyYgXhZcajzrnQx0m1rRhgQidjcdTJ8RkuZ9G4az5Mi9dfNz3OXq95cmJF4lVUTAboC9bIOfJj9ulomd/rXqF/cf1DyNvxB1irWxfp0SQFQMYdWI7q4kTk5eO9/58lmQcAKbuc0xEzK6f69dBqnyKotaF4scVf6xERFyWeSJkZWNKv0A8T2S9Ns7zNCZZGqXlvhm0RAA79HNKADZy54q9qILhxws69y+QDFNJKxm3S14Q0xaSOxb/+yd6pSnmzkHqxHHOOgfx632myTXwL9YBgO75/HNrZIrTQ+xTdWXEdeiS+dSA5B5Dd3x0rGc5LJjbl/SF0mcIhb97S9Bf3AghhBBCCCGEEEI0FD24EUIIIYQQQgghhGgoenAjhBBCCCGEEEII0VD04EYIIYQQQgghhBCioSxVTmz2UFr5odQUUbK9euETgChJYzJdJvxz0qfq5YuxCm3F6WEFz93SpQux0ImTuGyPlHkpnBfyAVzA5MtKBMZAeKzo5cTWAqeZIaHnhdQlcmJ2PnzfYXVKIPIuJm80V3ZwGGVhFRH+zZmk7pToVVG+PaiIoK1ATBsExkAUlrHslghYS/oFEK5NZ4Ey82ViltDvk/HhUUol5W7MTvRcFoxFVIZMcuHEgF2SJy+dXzbs+y8PiOx6M0r0A15EDMAOnAjRb7M6ALlHkL7B+pC7Vt2uk7a2YKwHAJjBBidIuJm4lo2/7tylXpkoN/lrwPoh6wujXCq/2dsPVXrp9MTzJXhxKwBc6sdjqc673DNRK5vnlci1i3JfOjdyOe96OXFbgu848i8DqJn5Lhl3yLVMHVfGZMVdInw9l4uHL/bjNWJC7GXCMr/ZI1lad5ln55fdJ312WeZpX/Ei78LMs/G/jaQUj8+fg27hHN3/VmXzEvJ71s/RE8m4f8kIAHQu5uM4nTukZ/t3HazfnSP3MpvkxzJn56527gueD5Rm3P9eq/v7DfqLGyGEEEIIIYQQQojGogc3QgghhBBCCCGEEA1FD26EEEIIIYQQQgghGsqzXbwJRDmNXxsLAGBuArfej6zZpt6bkjYRb4c57wGej46bK6PduK+oDzg1PjIh7pJLsZ3Yc+3c2wtVbC+ub8e+O5gDcnBsnatf08/W9hW4jbzjhl/hhmFAp3Lt9GswWeb9ZxhkbSV1HoR1uMRpMYjuAu+FmYzi5/q2Fsr20/1QdloMqo1Q9vw45hnu+IycA7bGNXg89smae+bx8H2DrYMtcAHFzLcDM6DXc8fn+z1zfRSs+2XustQnzpmDfAyzA5Jx5kIY5mWXJnFcH5DcH6QHcV+nRM+i2+mVMenXF9azbXpPZM4Of09g9wNWVpJ7Nt65NeFVx7W0LaqPCrC+G9/9end2j6T7yg+aXafE3C3Oc8CcIJT1Sbb58trtUGWA6Ew6AMnBKdFD7K8vjcmYfD4/Fjqq+PkMEPw1dB7E5j37Bb6EaewL4d7clpx7/Lhd6C87Ce/wAIDE5ueuLBV69uxiPj6+Molzhx7xic2wPE/LgHz/i2SOY5sFmS9wNhmZ49C+4vfFrjm7x/vx/ylcH8+UhHgsfmwv/a3jvaOP+bqTMDYPIn2oes7lnoyhfZK7KUh+TgnW714ak9/Y54jH1XPIPH5ubGcev5K+wDJe4nvy2XiCbqC/uBFCCCGEEEIIIYRoKHpwI4QQQgghhBBCCNFQ9OBGCCGEEEIIIYQQoqHowY0QQgghhBBCCCFEQ3nmcuIUpGZlUrEAEVYyMVSa5fs3JtRiQikvGBxESd4XPnkjlP3a63FXp8V/+9m3Q5ntfDRW3MkFT/aASDV3mbDSldUV8LVVRlYDA2DeOuXlZKUiv5LzxvrBXi75YrJKKi11At/L3xOv9/pvRfn1PpYnJx7b+VD2ye+8FSv687KzE6pQSavvK4uUtDJcNqoWy4k7Xk58ksgPAKoCiTOR7aGK0jovtqRSy2GUrXo5/Uc/ux2qrH8lCvEOsDw58RBRjvzaK1djxfEr+fZumUg25LxY0urK/H0T4PdlJ3e1rrtPt0FE/y38WOPviTXl/AzqsvW5Z3U65B7gpNxsHB3/3pVQdmDLkxMPU5Ryf/fL12PF0QvZpjG5KntzhL8H+DkP8BhRqxvLyNiWCqTcrSSlcGzmzweTBVNJqxfXxjrGXkTi9m+l53WS5+m7Phnn0JM/fjGU3Qd5AcIpMbQoaf30x98jFT+Rb7P5DBl7zIvoWb5ZP/AZpyJi9nvgBDlxW4b6lJDc2G4Hbo7McnhEZPHhHJDcU9F/XubHcLpvAFgfZ5ufe+X9UGX4p5dD2TLlxBMiov/Ut7PcP59tBukwwOffXsrN5kYl8x42j6XX/YT58BMEX39xI4QQQgghhBBCCNFQ9OBGCCGEEEIIIYQQoqHowY0QQgghhBBCCCFEQ9GDGyGEEEIIIYQQQoiG8szlxHB+HipwSzVtVdOo7rOukzl1ybOrPSLnuu/kl0SQ9okfioLMc7+Ty1PvVXdJQ+txfp6LYa/8OKn01jdP3hGTKxWIh4N0GABm5PqVilk93knqLicVMzaQIJj1srBCgWeoVyL3A2BBAE6uNxNzOUFa59WNUOXfW7sUyn55+xtxX6fEvz/6jlA2/A4iaXWSMbt1O9YhMr8gaWXiPiZp9X2KyRkJXtZubQm5xxKqXn4syZ0Tq4jwkI3HBXJzLpn3MmQypjGZn7vGvW8/F6r8lY0o7vs/7r8T93VK/MDwY6Hs3GdIv3PnwO5tkTpkrPHj/z45d3XvEfT78mxU3t/Y1n4Akvs5yTgVFp8gtX/M50JfYJLSXhSe+n42/M71UOUHLmyGsl+7eyfu65T43GbsixufJjJ6f17uR8E4PedBuFr4Agb/uRI5JWtDW8Ssj5IAHLp+H2TjJPPdAllzyTwIgIXxityT2YsbHGt/Id4PPvfb41D2W7eXJyf+3gtRyD3+NOm/fu6wRTLPxuMCsTad47g8hz4A8N9uXqg7dfup+3tv2bDc+3NwxH6DFuSencuCMvryDJZ7V7b5mdim7/2d+AKE/+dufKnHafF9F2O/G31H7AthjnO3cI7j74sl83hWxqTc7AUMPvcuO08y9usvboQQQgghhBBCCCEaih7cCCGEEEIIIYQQQjQUPbgRQgghhBBCCCGEaCgNcNx43wdzpJD1YmzNmsPI2r50UM+34t078524ru3gg9im/+U78zWz/9Mbz4U616sbJ37/i/PnQ9nPvpavsz38o+jP6bwY1yTa2K2PLVj7CyBeq5I126Wwa1V3Xw0jHJpfG8z8EezY3Y6MuolIl/b734nrs1lf8Z+b342f+y8/GTP3R7/3fdn2n+PfxH3X5BP4XLb9X3/qXqiT9uJ5qd65lheMB3HnzCHhM86cB6wflHidKvLc3Ls+zMs+2oEZ0HGOG39stHeTHFrXnQO2prhgXb71yPpsdg3cOvG0G6/5f/Wpm6HsT3/3u7Ptr9ofxn3X5NWUu5z+i4/HY0nsPnkt7582IW4G1vfnH+4nAlDmMytxtwChD1WdlrqeEuJ85SDPT5oxjxNxk/lzybwp7Lr083uAkfGespev+Z/7NfgAvvDJ66HsrddfyrbfnL9X9n0FvGovZtt/81XiL2C5v+Hq7UT3A50fFs1HC/w11HFwsr8x9OEW+D5SSqHd5sf6GenAJF/o5H3D2Dk7IP1n1/kqutE3SXG5YHPOn/y2ONZ/Y/tCtv32NM5D6vJKP/c4/fVXo4/Pe2EAIF3P22Bj4m9jhHk9cTix6+DHo9LfA+H72ul5SimF62BurKe/a9j8pePmOGwedEDmgm7MLrmXA0DaId4zx9/8WHSXvb2de1W/eURckTX5eD/3Zf7kx8nvYjLW44b7DTIic3uGPy815/bFXt65d0K57Sf4vau/uBFCCCGEEEIIIYRoKHpwI4QQQgghhBBCCNFQ9OBGCCGEEEIIIYQQoqHowY0QQgghhBBCCCFEQ3nmcuLkvD5MusVlhieLfOYlsh8mbpqRsv287PB+rLN9exh377Z/9MW1UOer9ybZdo8Ipr7rfCjCdJbLN3ffj58bI0raqnUnLxwS6VWpsLgObN/MPnkG5MSGhI55KVUut7I+kZUx4ZWDnh0vRwO4gDV8HxHSbecCs8P3o9BsbRAFeD/xci7g/sV3vyfUuVGdLLB8fv5yKPvJj25k2xvDKDA7vBrb2eveyrZtnQjMvASXwQTGCxRyYz/PglmLn61X7ry4Y6MZZzI/X8auExF8B/ko6QeJiUaduO/oWhxD10ZxrP8br+bCyl/85l8Ida5Vudw1hTsEcGkeBfZ/7eU89+eHt0Kdw9txX9XoQbZtG7FvWK9g/C+UDAfBHpX0FZa1kURkhdMCiWdFxt+uyysb273UEoD5zxGoUNHlfnYzCn3XJ7Gdf+3VfPuffvOlUOf6bDvbnpO71wWbhLLPv5y/SGF9EOXE0ztxXzbI5d3VxjTUSST3fsygwsiSTJfm2c9/C+a1jSMB8PN2P9aze11BWWKZZ+N/ib2cSGHTTp6L2e2Yk41x7E//2Ufz4/3ld86FOrensf94znXjPOQ/eSnPwPowjtlHd+Kx2DDvY9WkF+qgX/NlBwVC+WK5ahBy+07wJA17hiQimPXzt9LfUdXJ/SXMg1i9gusEAPPtPOdH9+K4vjGK+f28m4f8yrsXQ507Ryfn/lIvzp/+05fzdq6PSO5vxrJu30m52dye3CeLYC8EKBnri6TcJ//Gexwt/lUghBBCCCGEEEIIcbbRgxshhBBCCCGEEEKIhqIHN0IIIYQQQgghhBAN5Zk7bgJk3Rdd9+s8NHR9JVtCNvefi1XSNO5rtpdvHz6Ia+YOD2PZsJOvkXt1HNfsrnfzy9Cx+P1XBvFzPbcu/nCPtOlu/Fx3nq+nrA7iSbAeeaZX8pivZE0nqWNd8rm2rHX9EMyAjnd9HLp1k7vxGhWvrS+hYE1m2o9rOWdbeU4ObsdrND2KmTvXy/P0Vy7EdbA39nJpU4dc/kvDGLhzvfxcHc5iHdbOqp+vu6122Rpxsg62wBdRBFmDz1wUyWWDjQWtwOIhpwN3zg8LvQd+1x02NpE14b6A5d63CcD8fp6x6Y04Ph6y3DtX1V++HH1mN/ZyjwfRqeHSMB7LhV6+79k81jnYirfzapgfS/eQjPUDcj7r5r6uq8Z9rr1qpxQceSFjxd4DV4+NISUuhJq5PyLOpMPDmLFNl81/57lRqHNzP/c/MZXhRaImuNDPXQwpkXvQ/dimzihvU4d0tGoQ+3Dy8xB2rWq6E0tI/rK0YfhPQHLjymlmHiDem9CmsjnOfNvNJ+7Fzx2ROYafh/zFSzHztw9OHutZ5s/18rnKfB6//3CLzHEGzs9DOhn3WfrtwmsV5pVlH/OkwwIvWhNJKeQeB3nGUul9bFFOUfJbmc7tt/P+yfLEcnfBzXH+4uXoqrl9EOc9nsvD2E6fe9bvWP+snAOqYjeXftwXnUcWUOTxY/hnD76dT9B/Wjs9EkIIIYQQQgghhDjr6MGNEEIIIYQQQgghREPRgxshhBBCCCGEEEKIhnLigxsz+wUzu2Fmf/xI2QUz+3Uze/P4f89/2D6EaBvKvVg1lHmxiij3YhVR7sWqocyLs0CJnPhLAP5XAL/4SNkXAfxGSulnzOyLx9t/r1YLnJCHiYiDAAoIEiYmGWayH7//FL1NURAHYHaQy5vmMyIKJH6piZOYXSHC1fVu3oiKCEnXe1HI1nefmxGZk283ANiOOwdECF31yclz4j4mRgRzbFUnfy4V/PHXkv887EtYQO4NCX0nqGayMA8VchdIhim+j5H+NN+PZbPtfP+Hu3G4MJLVC/08q59aj1fuChGwes734nny+2Yc7cfvO3Ki5c48dvIiSXdd2RzrK0TI7YVlvc7JWVkgX8ICx3ovmA25rynkC/LVx1Ei5SbXfHY/b+fRXtlFP+/G6E+tRRHkc06IyoSVGyT3l5x4MgjPARwexnb2d9zYa3Hf1XCBY31dnq2P8ktYVO5TfLlB7dwX1Cs6beyFDyz3D/Kyw92y3J9zAuGPT2LuL/bzewfL/Xo3tsnLiTsVafdRPE+zkPuT55AATjf3BRcriK1Pt198CYvIfUrhvhXEm3WpO9aTazs/IHJil/nZAZGYkiZsunnIJ+hYn2eexW2TjPW+P1Us81My19/J92UVeQEDGQvCSxJOe6Jd8JvvFPkSTnOsny51vkbOZeFY734DzqYxvyx3PpufWIthuezmOCxOLPfn3RyH9TvWP/18jcFewJBc7ulYT6AvjqnB00i5T+yiKaXfBnDHFX8ewJeP//3LAH6s+BuFaAHKvVg1lHmxiij3YhVR7sWqocyLs0DdZ6tXUkpXj//9GoArj6toZj9tZq+b2ev3j3Zqfp0QjaAo949m/s7hHqsiRFuoNdbf2tt/XDUh2kCt3N/cPXhcNSHawBPPcW4p86LdaKwXreKp/ygupZTwIX8EmlL6uZTSayml1za6k6f9OiEawYfl/tHMX+iNltwyIU6HJxnrL42GS2yZEKfHk+T+8niwxJYJcXqUznEuKfPijKCxXrSBug9urpvZCwBw/L83FtckIRqLci9WDWVerCLKvVhFlHuxaijzolWUyIkZvwrgpwD8zPH//krZxxI6RGaawax1TFh85LdJHbKr+DlSh4iHvYw4zWMdJs4b9PIvOBe/DhNXh8mJveCW7duIsJJJlOdeisQeMBO3nLm0JPJ9XkgKIArmiJSVaaG8BIqJcJfME+feLEqkg7iPSrRZodtkkiwq6c7rzaekykHc19Geyzz5ul4nfqGXjLGrdqEfZWieMcm8lwKy72eZ98cCkt0iSTcTmJHMB9EZC7iXApI2dMnxLZmaY30kSPIWKbelX+g2mbByP5bN3OpGdj9g12XD5f7FFD+32csHUXZ1S3LfJXXYPenIyemtw+6TZBx33dO6ZWMvHf/bSb3cJzLHWJSotZSC3HupJgDM99x9guSezXHWXDZfSCe/gIGlaUgyvRFyX3YuZ4d52ytyf2OtqD3HWRBhPrr8Kc+T555lvuAFDAul5lg/d6td5qTZ3W4sXHOS1itUtp2HKZEb3qgTf4D4+0hp5ufuvQ2zvdioas7kxK5eyXxmgYSxaPlTntMb6xfYf0vm+zT3ZOzzWWFzh5I5DsPPcYychHE35t73Kdbv2EuIfB+2XZJxcl6s54TqC8x4SX95Gil3yevA/wmA/xfAp83sPTP7Ah4G/IfN7E0A/9HxthBnBuVerBrKvFhFlHuxiij3YtVQ5sVZ4MS/uEkp/cRj/q8fWnBbhGgMyr1YNZR5sYoo92IVUe7FqqHMi7PA2fnDZiGEEEIIIYQQQogzRl3HTS0MVG+SQdfokWV1ybtwqCeElPk1gcwBwz5XsBytImsCB718nV6HrJmezb3jJu6bOQ16bt/MjcM9P85dQj7HlpmaO+fegwDwdYLBvcPWahbQde08bUXGIjBL6Pn1/c71kYJzCPQchfWdLPMljptDUoWVkb7hYbn0a1XZGtf1+cmOm34V9z0pcH0w/LH4dbEPIefc7Z5lnjkPkt8XWzfOvCHuWvnstIkw1p6i64Pn3tVh9xbaF072mbH11+P+yeu/12b5WM+Gwh7xiIycz8x7swDuOPPjvz+241qhpOrnZb4fAA/9XSfviVCy/vuZq53qkVKcm9DxvQ6F983Q79h8hrSJ+T08nW68MOMC78HIOQ3YvIQ5FUY95zRjuWc59Bq5wtzXneOUUOLGYdeq6aQUvYm2qMwzCuZGy8488y9OZnl252TGysb6off49crmAGFez9xWzBPpm0A9lQu8nq7/+LHgmZssCyka62v+1im9/wXHDnHEJvb72WWFzR1Y7nzu2W/OCZtUOZizdeRyz/odw/dhNvbQoddfm0J/ZQnsqnvvzdO4nfQXN0IIIYQQQgghhBANRQ9uhBBCCCGEEEIIIRqKHtwIIYQQQgghhBBCNBQ9uBFCCCGEEEIIIYRoKEuXEwcZl3t0FIQ9eIxwycvHiNiHisfmXjwZq6R0snyOyZyqDhE8IW9op4rPyuYF39ch4j4vb2Lfz/CiVipXJfbAyon62Lmjgky3fyOyz6pAfhbkxC2wE5sl9JxYdL5/sriWCvhKLm+BpJv1Cy8rY9/HzjcTmA1TLhlj4r7Z/ORnxh0i7hu4c8mElowgaWUSSNIk34REckqlkwWPxI2MdZ5SMWHjSOScn+ww5RQI/mjf8NeO3SOIR69EDMjEeV5EX1k84MNZvdz7nLNcMFFgvN+x+ysR9Lts0ntEzf/sw+4RYd++3a0xVhJhZEE/p7sqGdpK7hMs9wXCSgabhwz6/uUKsU1Hs5Nl9Ow+4WXELPdleYpl7D7oI106xzlxR+CC71DH77otuS8QwZ/0mVJKXsDAzjUVP7txhs1xumSs7/vMk0wcFY31TArr5jhM0lqSeXK89KUjLnRU9l0g5C6Rbx/vLd/y7WxL5hs41pe8kIdC8sRyNxw4gTB92U7JS03ivv3Yzr6fZszPFdhLKJiI3vd91qdqz3FimX9hydNIufUXN0IIIYQQQgghhBANRQ9uhBBCCCGEEEIIIRqKHtwIIYQQQgghhBBCNBQ9uBFCCCGEEEIIIYRoKEuVE1cGDL2UqEBqRoVLXgpF5ZREuFogrCyROTGBFxM1eVHfnAiEvYiRfh/Zt/++urJeJmqtukRY6fRJxs5TkaiVnAMiS7R+3oZRx8k/W2AxMwN6vfxEeSEqFTpTAd/J38dl226bSCi9sJpBhdykrO+EknUFZuxzXtzKJLG0HxTITqnMz++eyYnJ95WI+krkrlRM2Bb8OfeS+UXKKen3u80CWT0Q5fQlYy8QhZVMMtwrkHIzSauXwrLcl8jpmXh/Tu65FXx/Ifsm57PoHnTG/3NRmJscfbiUsJjC3If+UXBPYNA5Tpd9MA8ClQw7Wyyb85TcX6iwsiBzVDJM2lB7jlOnDqPgvtg4mKQ1vDykprS19GPhdwTZV8Fcn9236UtH3JyO1lnQvL7Tq5l5cu5YnsO5YtktuRB1pyotnuLUkXLXfckI3dcpjvX8ZTs+9/HtDnV/z/qxvSK5L4FKyHnNfKt0PlMg6man3I8tTyPlPuNTKCGEEEIIIYQQQoj2ogc3QgghhBBCCCGEEA1FD26EEEIIIYQQQgghGsqSHTcJ6718TZxfo+f9H48rC/6EQlcNW+NfB7oem9Tz6wv5mumTF7ex7/Pr71gdRjgvZM0e8x6Yr0cOmLkQwjGTc+DXlgNA5fY/cdnx/qBGYnGtaFgPTj5Wtg62LMun6XWizgGXw2oW63QL+iFzJfhzyTJQ0g/Y8c5BvAtubX7oAwDvB369LGsTc674jxV4S9pC9B7U3E/p+m9/6gqcZxQ21pPr0nUHRP0FQZpUhnfcUK8SXY/txh56/zl5/Ge5Zz6IkrRSX06o00LXB/DQ9+GdYq6fFzuaPDW9B3X9fwwj433HDYBGJjl1vT6+n9Hc1/SAUe+Ndzsx/1yJC6GwScF70GbfxyM8a59ZieuPweYc1on1Ot71QV1pJd9Hyry7ktxrShx6DJ75k+ucptepzZkPY23BnK5kP5SajsuS3wnU7cTcSm4esNDcd0vmODVvJAVup+L5TN2bWcHv4FL0FzdCCCGEEEIIIYQQDUUPboQQQgghhBBCCCEaih7cCCGEEEIIIYQQQjQUPbgRQgghhBBCCCGEaChLlRN3qjk2h/tZmZeYMRFxOqon0isRHC5SjEWlqE7exERjC/u+QjlxXcoEWifLW5mcspqS73Miqs3RQbbdOeXjXQSGFKRbaXZ6uVxUv2BQQTa5BN7lt0iJdImQm0paHVzYScq8lHVOyqrekwAACv1JREFUZJUlUk8mNS6grnizCQRxn5cTs8/UjUqBgK+ulJtRIqdndVKhUPyk7yuRWj4NYYwozH2RNJOcg7qyzTZQknv6ubr3gAVJuek1YZ9zY1SHjHWLyj2b4/C+UOvrwnnxsuLHfq5m36srM20aIU81M78oiXGpkLtEDs2zdLJAuK6kteT7iyStrN/T3ygFbTi5Sn2p8RliUZLhuvuuO3+ieaJz1tPLvc85FYUX5Kl0bl9byu3vEYUZX+Sv1RXrVkIIIYQQQgghhBDtQQ9uhBBCCCGEEEIIIRqKHtwIIYQQQgghhBBCNJSlOm66nTnOb+5mZbO9vM58StZl1nRyLGyNOKPAZwMs1jtQ1IYa8LV9BeeceA9K9s98H3N6rZzjZiMPS6fTAv+HxfWcYT32Ag9j6V4ntlbVrXut7S0p/L5QZ5GuD3+uarpqSvuKp+R420JRDmq6MIrWfzPHTUF/YdeAuQJ8NbpCvOb1LMp0Xc9GgdeBnSe2Bn2RY8tZ4VTnIYyafaiEEu8N7RsLGpMXOR4W5b7w2pW6cFaGU/R40M8t6JbP803y7ER+dHys24YCfw313tT1Ormvo/e7RTqxzjI15yF1aWvul51xRvxdSiqVXM+FtObJ0F/cCCGEEEIIIYQQQjQUPbgRQgghhBBCCCGEaCh6cCOEEEIIIYQQQgjRUPTgRgghhBBCCCGEEKKhLFVObFVCbzTLyo72ztCzoxIBX4k4cIFy1dOUm9aWRs9IISmbH+Xb/UlecKri5wVSV3joOU1Jd13JGbsGyWX8NDNYnIGCeuwcnCSWftiGk7++7rVrM+G8LEiaWtp/TlOUWyosDp9bVAMaMPaVCouL9nWGJZaLlLMHCvpU3XNL5dPsmod+Xu/76rJ0YeUCP7cqNFHIWgq7luF61xz36n7/aVIyD6KfO8NjeCmLOgenLaYv+U1SlLu6L91oYKbrn4NaTXoqdHsRQgghhBBCCCGEaCh6cCOEEEIIIYQQQgjRUPTgRgghhBBCCCGEEKKh6MGNEEIIIYQQQgghRENZqpw4JcP8MH9WZN2TzT6nKTddOg2QSraF+Sy/8GnmbVJnKRg5bZbZemGwlxWfNWpLzQqQ5PKMSQ/9+F/aN2reN5Z97/TjVl1p52nKPltLS8bREpnrIvfdRE7zntAGztSYTVjUCydK9r1Q2Bii3ySiJkXi7haPe00dxxvQBCGEEEIIIYQQQgjB0IMbIYQQQgghhBBCiIbyVA9uzOxHzOzPzOwtM/vioholRJNR7sWqocyLVUS5F6uIci9WDWVetIXaD27MrAPgHwH4qwA+A+AnzOwzT7yjueX/iEaQ5vGfZ/59Vcr/wfLX5i4s96IWVqXsH3H6KPOniB/THvePWDrKvVgky55T1UW5F56U4j9nCWV+cViV/yMWz9Oc1u8H8FZK6esppSmAXwLw+cU0S4jGotyLVUOZF6uIci9WEeVerBrKvGgNT/Pg5iMA3n1k+73jsgwz+2kze93MXr+9v/8UXydEIzgx93nmD5baOCFOgSce628p96L91Mi95jii9TzRHOfWnjIvWs+Tj/XKvXhGnPofMqWUfi6l9FpK6bWLw+Fpf50Qz5w884Nn3RwhlsKjub+k3IsVIc+95jji7JNlfqTMi9VAuRdN4Gke3LwP4OVHtl86LhPiLKPci1VDmReriHIvVhHlXqwayrxoDZZqWqbMrAvgzwH8EB4G/HcB/I2U0hsf8pmbAN4GcAnArVpf/Gxpa7uB9rb9w9r9Skrp8jIb86S5fyTzwNm8Bk2mre0GGpT7FR3rgfa2/Sy2u/Fj/fFn2p77trYbaG/bW537M5B5oL1tP4vtbnzmjz/T9ty3td1Ae9u+kNx36357SunIzP4bAP8XgA6AX/iwkB9/5jIAmNnrKaXX6n73s6Kt7Qba2/amtftJc/9oR2zasZSidi+fJrV9Fcd6oL1tV7sXwyrmvq3tBtrb9qa1u+4cp2nH8SS0te1q92LQWN8u2tr2RbW79oMbAEgp/SsA/+ppGyFEm1DuxaqhzItVRLkXq4hyL1YNZV60Bb1lXQghhBBCCCGEEKKhPKsHNz/3jL73aWlru4H2tr2t7Wa09VjU7uXT5rY/SpuPo61tV7ufPW09lra2G2hv29vabk+bj6OtbVe7nz1tPZa2thtob9sX0u7acmIhhBBCCCGEEEIIcbpoqZQQQgghhBBCCCFEQ1n6gxsz+xEz+zMze8vMvrjs7y/FzH7BzG6Y2R8/UnbBzH7dzN48/t/zz7KNDDN72cx+08z+xMzeMLO/fVzehrYPzex3zOwPjtv+94/LP2ZmXznOzD81s/6zbuuT0JbMA8r9sjmrmQfak3tlfvmc1dy3JfOAcr9szmrmAeV+GSj3zaMtuVfml8tpZ36pD27MrAPgHwH4qwA+A+AnzOwzy2zDE/AlAD/iyr4I4DdSSp8E8BvH203jCMDfTSl9BsAPAPhbx+e4DW0/APCDKaXvAfBZAD9iZj8A4B8A+NmU0icA3AXwhWfYxieiZZkHlPtlc+YyD7Qu91+CMr9szlzuW5Z5QLlfNmcu84Byv0SU+wbRstx/Ccr8MjnVzC/7L26+H8BbKaWvp5SmAH4JwOeX3IYiUkq/DeCOK/48gC8f//uXAfzYUhtVQErpakrp947/fRvAVwF8BO1oe0opPTje7B3/kwD8IIB/cVzeyLZ/CK3JPKDcL5szmnmgRblX5pfPGc19azIPKPfL5oxmHlDul4Jy3zhak3tlfrmcduaX/eDmIwDefWT7veOytnAlpXT1+N+vAbjyLBtzEmb2KoDvBfAVtKTtZtYxs98HcAPArwP4GoB7KaWj4ypty0zbMw+0JDvfom25P4OZB9qf+8bn5lHalnngTOa+7ZkHWpKdb9G23J/BzAPK/dJR7htB23Pf+Nw8ijL//yM5cU3Sw9dxNfaVXGa2BuCXAfydlNL9R/+/Jrc9pTRLKX0WwEt4+ET7259xk8QjNDk7QDtzr8w3m6bm5lu0MfOAct90mpwdoJ25V+abT1Oz8y2Ue7Fompqbb6HM5yz7wc37AF5+ZPul47K2cN3MXgCA4/+98YzbQzGzHh6G/B+nlP7lcXEr2v4tUkr3APwmgL8E4JyZdY//r7Zlpu2ZB1qSnbbn/gxlHmh/7luRm7ZnHjhTuW975oGWZKftuT9DmQeU+6Wh3DeKtue+FblR5iPLfnDzuwA+eWxW7gP46wB+dclteBp+FcBPHf/7TwH4lWfYFoqZGYCfB/DVlNI/fOT/akPbL5vZueN/HwH4YTxc0/ibAH78uFoj2/4htD3zQDuy08rcn9HMA+3PfaNzA7Q388CZzX3bMw+0IzutzP0ZzTyg3C8F5b5xtD33jc4NoMw/lpTSUv8B8KMA/hwP13v9D8v+/ido5z8BcBXAIR6uRfsCgIt4aLB+E8D/DeDCs24nafe/i4d/NvaHAH7/+J8fbUnbvxvAvz1u+x8D+B+Py78NwO8AeAvAPwcweNZtfcLjakXmj9uq3C+33Wcy88fH0IrcK/PPpO1nMvdtyfxxW5X75bb7TGb++BiU+9Nvt3LfsH/akntlfuntPtXM2/HOhBBCCCGEEEIIIUTDkJxYCCGEEEIIIYQQoqHowY0QQgghhBBCCCFEQ9GDGyGEEEIIIYQQQoiGogc3QgghhBBCCCGEEA1FD26EEEIIIYQQQgghGooe3AghhBBCCCGEEEI0FD24EUIIIYQQQgghhGgoenAjhBBCCCGEEEII0VD+P1K+eqk6v4ieAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" + "cell_type": "markdown", + "metadata": { + "id": "tayrJa7_ZzS_" + }, + "source": [ + "\n", + "Let's assume $\\mathcal{P}$ advances a solution by a time step $\\Delta t$, and let's denote $n$ consecutive steps by a superscript:\n", + "$\n", + "\\newcommand{\\pde}{\\mathcal{P}}\n", + "\\newcommand{\\pdec}{\\pde_{s}}\n", + "\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \n", + "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", + "\\newcommand{\\vcN}{\\vs} \n", + "\\newcommand{\\project}{\\mathcal{T}} \n", + "\\pdec^n ( \\mathcal{T} \\vr{t} ) = \\pdec(\\pdec(\\cdots \\pdec( \\mathcal{T} \\vr{t} )\\cdots)) .\n", + "$ \n", + "The corresponding state of the simulation is\n", + "$\n", + "\\mathbf{s}_{t+n} = \\mathcal{P}^n ( \\mathcal{T} \\mathbf{r}_{t} ) .\n", + "$\n", + "Here we assume a mapping operator $\\mathcal{T}$ exists that transfers a reference solution to the source manifold. This could, e.g., be a simple downsampling operation.\n", + "Especially for longer sequences, i.e. larger $n$, the source state \n", + "$\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \\vc{t+n}$\n", + "will deviate from a corresponding reference state\n", + "$\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \\vr{t+n}$. \n", + "This is what we will address with an NN in the following.\n", + "\n", + "As before, we'll use an $L^2$-norm to quantify the deviations, i.e., \n", + "an error function $\\newcommand{\\loss}{e} \n", + "\\newcommand{\\corr}{\\mathcal{C}} \n", + "\\newcommand{\\vc}[1]{\\mathbf{s}_{#1}} \n", + "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", + "\\loss (\\vc{t},\\mathcal{T} \\vr{t})=\\Vert\\vc{t}-\\mathcal{T} \\vr{t}\\Vert_2$. \n", + "Our learning goal is to train at a correction operator \n", + "$\\mathcal{C} ( \\mathbf{s} )$ such that \n", + "a solution to which the correction is applied has a lower error than the original unmodified (source) \n", + "solution: $\\newcommand{\\loss}{e} \n", + "\\newcommand{\\corr}{\\mathcal{C}} \n", + "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", + "\\loss ( \\mathcal{P}_{s}( \\corr (\\mathcal{T} \\vr{t}) ) , \\mathcal{T} \\vr{t+1}) < \\loss ( \\mathcal{P}_{s}( \\mathcal{T} \\vr{t} ), \\mathcal{T} \\vr{t+1})$. \n", + "\n", + "The correction function \n", + "$\\newcommand{\\vcN}{\\mathbf{s}} \\newcommand{\\corr}{\\mathcal{C}} \\corr (\\vcN | \\theta)$ \n", + "is represented as a deep neural network with weights $\\theta$\n", + "and receives the state $\\mathbf{s}$ to infer an additive correction field with the same dimension.\n", + "To distinguish the original states $\\mathbf{s}$ from the corrected ones, we'll denote the latter with an added tilde $\\tilde{\\mathbf{s}}$.\n", + "The overall learning goal now becomes\n", + "\n", + "$$\n", + "\\newcommand{\\corr}{\\mathcal{C}} \n", + "\\newcommand{\\vr}[1]{\\mathbf{r}_{#1}} \n", + "\\text{arg min}_\\theta \\big( ( \\mathcal{P}_{s} \\corr )^n ( \\mathcal{T} \\vr{t} ) - \\mathcal{T} \\vr{t+n} \\big)^2\n", + "$$\n", + "\n", + "To simplify the notation, we've dropped the sum over different samples here (the $i$ from previous versions).\n", + "A crucial bit that's easy to overlook in the equation above, is that the correction depends on the modified states, i.e.\n", + "it is a function of\n", + "$\\tilde{\\mathbf{s}}$, so we have \n", + "$\\newcommand{\\vctN}{\\tilde{\\mathbf{s}}} \\newcommand{\\corr}{\\mathcal{C}} \\corr (\\vctN | \\theta)$.\n", + "These states actually evolve over time when training. They don't exist beforehand.\n", + "\n", + "**TL;DR**:\n", + "We'll train a network $\\mathcal{C}$ to reduce the numerical errors of a simulator with a more accurate reference. It's crucial to have the _source_ solver realized as a differential physics operator, such that it provides gradients for an improved training of $\\mathcal{C}$.\n", + "\n", + "
\n", + "\n", + "---\n" ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "c = 0 # channel selector, x=1 or y=0 \n", - "interval = 20 # time interval\n", - "\n", - "fig, axes = pylab.subplots(1, 6, figsize=(16, 5)) \n", - "for i in range(0,6):\n", - " v = steps_source[i*interval][1].values.vector[c].numpy('batch,y,x')[b,...]\n", - " axes[i].imshow( v , origin='lower', cmap='magma')\n", - " axes[i].set_title(f\" Source simulation t={i*interval} \")\n", - "\n", - "pylab.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 313 }, - "id": "v2d2WTGedIxt", - "outputId": "888de2df-1934-4813-ba56-98321c8c37c9" - }, - "outputs": [ { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" + "cell_type": "markdown", + "metadata": { + "id": "hPgwGkzYdIww" + }, + "source": [ + "## Getting started with the implementation\n", + "\n", + "The following replicates an experiment from [Solver-in-the-loop: learning from differentiable physics to interact with iterative pde-solvers](https://ge.in.tum.de/publications/2020-um-solver-in-the-loop/) {cite}`holl2019pdecontrol`, further details can be found in section B.1 of the [appendix](https://arxiv.org/pdf/2007.00016.pdf) of the paper.\n", + "\n", + "First, let's download the prepared data set (for details on generation & loading cf. https://github.com/tum-pbs/Solver-in-the-Loop), and let's get the data handling out of the way, so that we can focus on the _interesting_ parts..." ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, axes = pylab.subplots(1, 6, figsize=(16, 5))\n", - "for i in range(0,6):\n", - " v = steps_hybrid[i*interval][1].values.vector[c].numpy('batch,y,x')[b,...]\n", - " axes[i].imshow( v , origin='lower', cmap='magma')\n", - " axes[i].set_title(f\" Hybrid solver t={i*interval} \")\n", - "pylab.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ivS0SUiYdIxt" - }, - "source": [ - "They both start out with the same initial state at $t=0$ (the downsampled solution from the reference solution manifold), and at $t=20$ the solutions still share similarities. Over time, the source version strongly diffuses the structures in the flow and looses momentum. The flow behind the obstacles becomes straight, and lacks clear vortices. \n", - "\n", - "The version produced by the hybrid solver does much better. It preserves the vortex shedding even after more than one hundred updates. Note that both outputs were produced by the same underlying solver. The second version just profits from the learned corrector which manages to revert the numerical errors of the source solver, including its overly strong dissipation. \n", - "\n", - "We also visually compare how the NN does w.r.t. reference data. The next cell plots one time step of the three versions: the reference data after 50 steps, and the re-simulated version of the source and our hybrid solver, together with a per-cell error of the two:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 349 }, - "id": "23yyfljqdIxu", - "outputId": "9051bab9-59dc-4029-9a34-588ffc3aba8a" - }, - "outputs": [ { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JwZudtWauiGa", + "outputId": "d82af215-e4e6-40b3-bfbc-52c1013cfb74" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Loaded data, 6 training sims\n" + ] + } + ], + "source": [ + "import os, sys, logging, argparse, pickle, glob, random, distutils.dir_util, urllib.request\n", + "\n", + "fname_train = 'sol-karman-2d-train.pickle'\n", + "if not os.path.isfile(fname_train):\n", + " print(\"Downloading training data (73MB), this can take a moment the first time...\")\n", + " urllib.request.urlretrieve(\"https://physicsbaseddeeplearning.org/data/\"+fname_train, fname_train)\n", + "\n", + "with open(fname_train, 'rb') as f: data_preloaded = pickle.load(f)\n", + "print(\"Loaded data, {} training sims\".format(len(data_preloaded)) )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RY1F4kdWPLNG" + }, + "source": [ + "Also let's get installing / importing all the necessary libraries out of the way. And while we're at it, we set the random seed - obviously, 42 is the ultimate choice here 🙂" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "BGN4GqxkIueM" + }, + "outputs": [], + "source": [ + "!pip install --upgrade --quiet phiflow\n", + "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", + "\n", + "from phi.tf.flow import *\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "\n", + "random.seed(42) \n", + "np.random.seed(42)\n", + "tf.random.set_seed(42)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OhnzPdoww11P" + }, + "source": [ + "## Simulation setup\n", + "\n", + "Now we set up the _source_ simulation $\\mathcal{P}_{s}$. \n", + "Note that we won't deal with \n", + "$\\mathcal{P}_{r}$\n", + "below: the downsampled reference data is contained in the training data set. It was generated with a four times finer discretization. Below we're focusing on the interaction of the source solver and the NN. \n", + "\n", + "This code block and the next ones will define lots of functions, that will be used later on for training.\n", + "\n", + "The `KarmanFlow` solver below simulates a relatively standard wake flow case with a spherical obstacle in a rectangular domain, and an explicit viscosity solve to obtain different Reynolds numbers. This is the geometry of the setup:\n", + "\n", + "```{figure} resources/diffphys-sol-domain.png\n", + "---\n", + "height: 200px\n", + "name: diffphys-sol-domain\n", + "---\n", + "Domain setup for the wake flow case (sizes in the imlpementation are using an additional factor of 100).\n", + "```\n", + "\n", + "The solver applies inflow boundary conditions for the y-velocity with a pre-multiplied mask (`vel_BcMask`), to set the y components at the bottom of the domain during the simulation step. This mask is created with the `HardGeometryMask` from phiflow, which initializes the spatially shifted entries for the components of a staggered grid correctly. The simulation step is quite straight forward: it computes contributions for viscosity, inflow, advection and finally makes the resulting motion divergence free via an implicit pressure solve:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "6WNMcdWUw4EP" + }, + "outputs": [], + "source": [ + "class KarmanFlow():\n", + " def __init__(self, domain):\n", + " self.domain = domain\n", + "\n", + " self.vel_BcMask = self.domain.staggered_grid(HardGeometryMask(Box[:5, :]) )\n", + " \n", + " self.inflow = self.domain.scalar_grid(Box[5:10, 25:75]) # scale with domain if necessary!\n", + " self.obstacles = [Obstacle(Sphere(center=[50, 50], radius=10))] \n", + "\n", + " def step(self, density_in, velocity_in, re, res, buoyancy_factor=0, dt=1.0):\n", + " velocity = velocity_in\n", + " density = density_in\n", + "\n", + " # viscosity\n", + " velocity = phi.flow.diffuse.explicit(field=velocity, diffusivity=1.0/re*dt*res*res, dt=dt)\n", + " \n", + " # inflow boundary conditions\n", + " velocity = velocity*(1.0 - self.vel_BcMask) + self.vel_BcMask * (1,0)\n", + "\n", + " # advection \n", + " density = advect.semi_lagrangian(density+self.inflow, velocity, dt=dt)\n", + " velocity = advected_velocity = advect.semi_lagrangian(velocity, velocity, dt=dt)\n", + "\n", + " # mass conservation (pressure solve)\n", + " pressure = None\n", + " velocity, pressure = fluid.make_incompressible(velocity, self.obstacles)\n", + " self.solve_info = { 'pressure': pressure, 'advected_velocity': advected_velocity }\n", + " \n", + " return [density, velocity]\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RYFUGICgxk0K" + }, + "source": [ + "## Network architecture\n", + "\n", + "We'll also define two alternative versions of a neural networks to represent \n", + "$\\newcommand{\\vcN}{\\mathbf{s}} \\newcommand{\\corr}{\\mathcal{C}} \\corr$. In both cases we'll use fully convolutional networks, i.e. networks without any fully-connected layers. We'll use Keras within tensorflow to define the layers of the network (mostly via `Conv2D`), typically activated via ReLU and LeakyReLU functions, respectively.\n", + "The inputs to the network are: \n", + "- 2 fields with x,y velocity\n", + "- the Reynolds number as constant channel.\n", + "\n", + "The output is: \n", + "- a 2 component field containing the x,y velocity.\n", + "\n", + "First, let's define a small network consisting only of four convolutional layers with ReLU activations (we're also using keras here for simplicity). The input dimensions are determined from input tensor in the `inputs_dict` (it has three channels: u,v, and Re). Then we process the data via three conv layers with 32 features each, before reducing to 2 channels in the output. " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "qIrWYTy6xscA" + }, + "outputs": [], + "source": [ + "def network_small(inputs_dict):\n", + " l_input = keras.layers.Input(**inputs_dict)\n", + " block_0 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_input)\n", + " block_0 = keras.layers.LeakyReLU()(block_0)\n", + "\n", + " l_conv1 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_0)\n", + " l_conv1 = keras.layers.LeakyReLU()(l_conv1)\n", + " l_conv2 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv1)\n", + " block_1 = keras.layers.LeakyReLU()(l_conv2)\n", + "\n", + " l_output = keras.layers.Conv2D(filters=2, kernel_size=5, padding='same')(block_1) # u, v\n", + " return keras.models.Model(inputs=l_input, outputs=l_output)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YfHvdI7yxtdj" + }, + "source": [ + "For flexibility (and larger-scale tests later on), let's also define a _proper_ ResNet with a few more layers. This architecture is the one from the original paper, and will give a fairly good performance (`network_small` above will train faster, but give a sub-optimal performance at inference time)." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "TyfpA7Fbx0ro" + }, + "outputs": [], + "source": [ + "def network_medium(inputs_dict):\n", + " l_input = keras.layers.Input(**inputs_dict)\n", + " block_0 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_input)\n", + " block_0 = keras.layers.LeakyReLU()(block_0)\n", + "\n", + " l_conv1 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_0)\n", + " l_conv1 = keras.layers.LeakyReLU()(l_conv1)\n", + " l_conv2 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv1)\n", + " l_skip1 = keras.layers.add([block_0, l_conv2])\n", + " block_1 = keras.layers.LeakyReLU()(l_skip1)\n", + "\n", + " l_conv3 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_1)\n", + " l_conv3 = keras.layers.LeakyReLU()(l_conv3)\n", + " l_conv4 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv3)\n", + " l_skip2 = keras.layers.add([block_1, l_conv4])\n", + " block_2 = keras.layers.LeakyReLU()(l_skip2)\n", + "\n", + " l_conv5 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_2)\n", + " l_conv5 = keras.layers.LeakyReLU()(l_conv5)\n", + " l_conv6 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv5)\n", + " l_skip3 = keras.layers.add([block_2, l_conv6])\n", + " block_3 = keras.layers.LeakyReLU()(l_skip3)\n", + "\n", + " l_conv7 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_3)\n", + " l_conv7 = keras.layers.LeakyReLU()(l_conv7)\n", + " l_conv8 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv7)\n", + " l_skip4 = keras.layers.add([block_3, l_conv8])\n", + " block_4 = keras.layers.LeakyReLU()(l_skip4)\n", + "\n", + " l_conv9 = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(block_4)\n", + " l_conv9 = keras.layers.LeakyReLU()(l_conv9)\n", + " l_convA = keras.layers.Conv2D(filters=32, kernel_size=5, padding='same')(l_conv9)\n", + " l_skip5 = keras.layers.add([block_4, l_convA])\n", + " block_5 = keras.layers.LeakyReLU()(l_skip5)\n", + "\n", + " l_output = keras.layers.Conv2D(filters=2, kernel_size=5, padding='same')(block_5)\n", + " return keras.models.Model(inputs=l_input, outputs=l_output)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ew-MgPSlyLW-" + }, + "source": [ + "Next, we're coming to two functions which are pretty important: they transform the simulation state into an input tensor for the network, and vice versa. Hence, they're the interface between _keras/tensorflow_ and _phiflow_.\n", + "\n", + "The `to_keras` function uses the two vector components via `vector['x']` and `vector['y']` to discard the outermost layer of the velocity field grids. This gives two tensors of equal size that are concatenated. \n", + "It then adds a constant channel via `math.ones` that is multiplied by the desired Reynolds number in `ext_const_channel`. The resulting stack of grids is stacked along the `channels` dimensions, and represents an input to the neural network. \n", + "\n", + "After network evaluation, we transform the output tensor back into a phiflow grid via the `to_phiflow` function. \n", + "It converts the 2-component tensor that is returned by the network into a phiflow staggered grid object, so that it is compatible with the velocity field of the fluid simulation.\n", + "(Note: these are two _centered_ grids with different sizes, so we leave the work to the `domain.staggered_grid` function, which also sets physical size and boundary conditions as given by the domain object)." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "hhGFpTjGyRyg" + }, + "outputs": [], + "source": [ + "\n", + "def to_keras(dens_vel_grid_array, ext_const_channel):\n", + " # align the sides the staggered velocity grid making its size the same as the centered grid\n", + " return math.stack(\n", + " [\n", + " math.pad( dens_vel_grid_array[1].vector['x'].values, {'x':(0,1)} , math.extrapolation.ZERO),\n", + " dens_vel_grid_array[1].vector['y'].y[:-1].values, # v\n", + " math.ones(dens_vel_grid_array[0].shape)*ext_const_channel # Re\n", + " ],\n", + " math.channel('channels')\n", + " )\n", + "\n", + "def to_phiflow(tf_tensor, domain):\n", + " return domain.staggered_grid(\n", + " math.stack(\n", + " [\n", + " math.tensor(tf.pad(tf_tensor[..., 1], [(0,0), (0,1), (0,0)]), math.batch('batch'), math.spatial('y, x')), # v\n", + " math.tensor( tf_tensor[...,:-1, 0], math.batch('batch'), math.spatial('y, x')), # u \n", + " ], math.channel('vector')\n", + " )\n", + " )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VngMwN_9y00S" + }, + "source": [ + "---\n", + "\n", + "## Data handling\n", + "\n", + "So far so good - we also need to take care of a few more mundane tasks, e.g., some data handling and randomization. Below we define a `Dataset` class that stores all \"ground truth\" reference data (already downsampled).\n", + "\n", + "We actually have a lot of data dimensions: multiple simulations, with many time steps, each with different fields. This makes the code below a bit more difficult to read.\n", + "\n", + "The data format for the numpy array `dataPreloaded`: is `['sim_name', frame, field (dens & vel)]`, where each field has dimension `[batch-size, y-size, x-size, channels]` (this is the standard for a phiflow export)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "tjywcdD2y20t" + }, + "outputs": [], + "source": [ + "class Dataset():\n", + " def __init__(self, data_preloaded, num_frames, num_sims=None, batch_size=1, is_testset=False):\n", + " self.epoch = None\n", + " self.epochIdx = 0\n", + " self.batch = None\n", + " self.batchIdx = 0\n", + " self.step = None\n", + " self.stepIdx = 0\n", + "\n", + " self.dataPreloaded = data_preloaded\n", + " self.batchSize = batch_size\n", + "\n", + " self.numSims = num_sims\n", + " self.numBatches = num_sims//batch_size\n", + " self.numFrames = num_frames\n", + " self.numSteps = num_frames\n", + " \n", + " # initialize directory keys (using naming scheme from SoL codebase)\n", + " # constant additional per-sim channel: Reynolds numbers from data generation\n", + " # hard coded for training and test data here\n", + " if not is_testset:\n", + " self.dataSims = ['karman-fdt-hires-set/sim_%06d'%i for i in range(num_sims) ]\n", + " ReNrs = [160000.0, 320000.0, 640000.0, 1280000.0, 2560000.0, 5120000.0]\n", + " self.extConstChannelPerSim = { self.dataSims[i]:[ReNrs[i]] for i in range(num_sims) }\n", + " else:\n", + " self.dataSims = ['karman-fdt-hires-testset/sim_%06d'%i for i in range(num_sims) ]\n", + " ReNrs = [120000.0, 480000.0, 1920000.0, 7680000.0] \n", + " self.extConstChannelPerSim = { self.dataSims[i]:[ReNrs[i]] for i in range(num_sims) }\n", + "\n", + " self.dataFrames = [ np.arange(num_frames) for _ in self.dataSims ] \n", + "\n", + " # debugging example, check shape of a single marker density field:\n", + " #print(format(self.dataPreloaded[self.dataSims[0]][0][0].shape )) \n", + " \n", + " # the data has the following shape ['sim', frame, field (dens/vel)] where each field is [batch-size, y-size, x-size, channels]\n", + " self.resolution = self.dataPreloaded[self.dataSims[0]][0][0].shape[1:3] \n", + "\n", + " # compute data statistics for normalization\n", + " self.dataStats = {\n", + " 'std': (\n", + " np.std(np.concatenate([np.absolute(self.dataPreloaded[asim][i][0].reshape(-1)) for asim in self.dataSims for i in range(num_frames)], axis=-1)), # density\n", + " np.std(np.concatenate([np.absolute(self.dataPreloaded[asim][i][1].reshape(-1)) for asim in self.dataSims for i in range(num_frames)], axis=-1)), # x-velocity\n", + " np.std(np.concatenate([np.absolute(self.dataPreloaded[asim][i][2].reshape(-1)) for asim in self.dataSims for i in range(num_frames)], axis=-1)), # y-velocity\n", + " )\n", + " }\n", + " self.dataStats.update({\n", + " 'ext.std': [ np.std([np.absolute(self.extConstChannelPerSim[asim][0]) for asim in self.dataSims]) ] # Reynolds Nr\n", + " })\n", + "\n", + " \n", + " if not is_testset:\n", + " print(\"Data stats: \"+format(self.dataStats))\n", + "\n", + "\n", + " # re-shuffle data for next epoch\n", + " def newEpoch(self, exclude_tail=0, shuffle_data=True):\n", + " self.numSteps = self.numFrames - exclude_tail\n", + " simSteps = [ (asim, self.dataFrames[i][0:(len(self.dataFrames[i])-exclude_tail)]) for i,asim in enumerate(self.dataSims) ]\n", + " sim_step_pair = []\n", + " for i,_ in enumerate(simSteps):\n", + " sim_step_pair += [ (i, astep) for astep in simSteps[i][1] ] # (sim_idx, step) ...\n", + "\n", + " if shuffle_data: random.shuffle(sim_step_pair)\n", + " self.epoch = [ list(sim_step_pair[i*self.numSteps:(i+1)*self.numSteps]) for i in range(self.batchSize*self.numBatches) ]\n", + " self.epochIdx += 1\n", + " self.batchIdx = 0\n", + " self.stepIdx = 0\n", + "\n", + " def nextBatch(self): \n", + " self.batchIdx += self.batchSize\n", + " self.stepIdx = 0\n", + "\n", + " def nextStep(self):\n", + " self.stepIdx += 1\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "twIMJ3V0N1FX" + }, + "source": [ + "The `nextEpoch`, `nextBatch`, and `nextStep` functions will be called at training time to randomize the order of the training data.\n", + "\n", + "Now we need one more function that compiles the data for a mini batch to train with, called `getData` below. It returns batches of the desired size in terms of marker density, velocity, and Reynolds number.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "Dfwd4TnqN1Tn" + }, + "outputs": [], + "source": [ + "# for class Dataset():\n", + "def getData(self, consecutive_frames):\n", + " d_hi = [\n", + " np.concatenate([\n", + " self.dataPreloaded[\n", + " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]] # sim_key\n", + " ][\n", + " self.epoch[self.batchIdx+i][self.stepIdx][1]+j # frames\n", + " ][0]\n", + " for i in range(self.batchSize)\n", + " ], axis=0) for j in range(consecutive_frames+1)\n", + " ]\n", + " u_hi = [\n", + " np.concatenate([\n", + " self.dataPreloaded[\n", + " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]] # sim_key\n", + " ][\n", + " self.epoch[self.batchIdx+i][self.stepIdx][1]+j # frames\n", + " ][1]\n", + " for i in range(self.batchSize)\n", + " ], axis=0) for j in range(consecutive_frames+1)\n", + " ]\n", + " v_hi = [\n", + " np.concatenate([\n", + " self.dataPreloaded[\n", + " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]] # sim_key\n", + " ][\n", + " self.epoch[self.batchIdx+i][self.stepIdx][1]+j # frames\n", + " ][2]\n", + " for i in range(self.batchSize)\n", + " ], axis=0) for j in range(consecutive_frames+1)\n", + " ]\n", + " ext = [\n", + " self.extConstChannelPerSim[\n", + " self.dataSims[self.epoch[self.batchIdx+i][self.stepIdx][0]]\n", + " ][0] for i in range(self.batchSize)\n", + " ]\n", + " return [d_hi, u_hi, v_hi, ext]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bIWnyPYlz8q7" + }, + "source": [ + "Note that the `density` here denotes a passively advected marker field, and not the density of the fluid. Below we'll be focusing on the velocity only, the marker density is tracked purely for visualization purposes.\n", + "\n", + "After all the definitions we can finally run some code. We define the dataset object with the downloaded data from the first cell." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "59EBdEdj0QR2", + "outputId": "aecfbbc6-d4ee-41c1-e92f-f1caf2d5c4a5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Data stats: {'std': (2.6542656, 0.23155601, 0.3066732), 'ext.std': [1732512.6262166172]}\n" + ] + } + ], + "source": [ + "nsims = 6\n", + "batch_size = 3\n", + "simsteps = 500\n", + "\n", + "dataset = Dataset( data_preloaded=data_preloaded, num_frames=simsteps, num_sims=nsims, batch_size=batch_size )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0N92RooWPzeA" + }, + "source": [ + "Additionally, we've defined several global variables to control the training and the simulation in the next code cells.\n", + "\n", + "The most important and interesting one is `msteps`. It defines the number of simulation steps that are unrolled at each training iteration. This directly influences the runtime of each training step, as we first have to simulate all steps forward, and then backpropagate the gradient through all `msteps` simulation steps interleaved with the NN evaluations. However, this is where we'll receive important feedback in terms of gradients how the inferred corrections actually influence a running simulation. Hence, larger `msteps` are typically better.\n", + "\n", + "In addition we define the resolution of the simulation in `source_res`, and allocate the fluid solver object called `simulator`. In order to create grids, it requires access to a `Domain` object, which mostly exists for convenience purposes: it stores resolution, physical size in `bounds`, and boundary conditions of the domain. This information needs to be passed to every grid, and hence it's convenient to have it in one place in the form of the `Domain`. For the setup described above, we need different boundary conditions along x and y: closed walls, and free flow in and out of the domain, respecitvely.\n", + "\n", + "We also instantiate the actual NN `network` in the next cell. " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EjgkdCzKP2Ip", + "outputId": "e38b8b33-7d6f-40e8-ce64-0250c908db7a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:16: DeprecationWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n", + " app.launch_new_instance()\n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:16: FutureWarning: Domain is deprecated and will be removed in a future release. Use a dict instead, e.g. CenteredGrid(values, extrapolation, **domain_dict)\n", + " app.launch_new_instance()\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Model: \"model_1\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_2 (InputLayer) [(None, 64, 32, 3)] 0 \n", + " \n", + " conv2d_4 (Conv2D) (None, 64, 32, 32) 2432 \n", + " \n", + " leaky_re_lu_3 (LeakyReLU) (None, 64, 32, 32) 0 \n", + " \n", + " conv2d_5 (Conv2D) (None, 64, 32, 32) 25632 \n", + " \n", + " leaky_re_lu_4 (LeakyReLU) (None, 64, 32, 32) 0 \n", + " \n", + " conv2d_6 (Conv2D) (None, 64, 32, 32) 25632 \n", + " \n", + " leaky_re_lu_5 (LeakyReLU) (None, 64, 32, 32) 0 \n", + " \n", + " conv2d_7 (Conv2D) (None, 64, 32, 2) 1602 \n", + " \n", + "=================================================================\n", + "Total params: 55,298\n", + "Trainable params: 55,298\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "# one of the most crucial! how many simulation steps to look into the future while training\n", + "msteps = 4\n", + "\n", + "# # this is the actual resolution in terms of cells\n", + "source_res = list(dataset.resolution)\n", + "# # this is a virtual size, in terms of abstract units for the bounding box of the domain (it's important for conversions or when rescaling to physical units)\n", + "simulation_length = 100.\n", + "\n", + "# for readability\n", + "from phi.physics._boundaries import Domain, OPEN, STICKY as CLOSED\n", + "\n", + "boundary_conditions = {\n", + " 'x':(phi.physics._boundaries.STICKY,phi.physics._boundaries.STICKY), \n", + " 'y':(phi.physics._boundaries.OPEN, phi.physics._boundaries.OPEN) }\n", + "\n", + "domain = Domain(y=source_res[0], x=source_res[1], bounds=Box[0:2*simulation_length, 0:simulation_length], boundaries=boundary_conditions)\n", + "simulator = KarmanFlow(domain=domain)\n", + "\n", + "network = network_small(dict(shape=(source_res[0],source_res[1], 3)))\n", + "network.summary()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AbpNPzplQZMF" + }, + "source": [ + "## Interleaving simulation and NN\n", + "\n", + "Now comes the **most crucial** step in the whole setup: we define a function that encapsulates the chain of simulation steps and network evaluations in each training step. After all the work defining helper functions, it's actually pretty simple: we create a gradient tape via `tf.GradientTape()` such that we can backpropagate later on. We then loop over `msteps`, call the simulator via `simulator.step` for an input state, and afterwards evaluate the correction via `network(to_keras(...))`. The NN correction is then added to the last simulation state in the `prediction` list (we're actually simply overwriting the last simulated velocity `prediction[-1][1]` with `prediction[-1][1] + correction[-1]`.\n", + "\n", + "One other important thing that's happening here is normalization: the inputs to the network are divided by the standard deviations in `dataset.dataStats`. After evaluating the `network`, we only have a velocity left, so we simply multiply it by the standard deviation of the velocity again (via `* dataset.dataStats['std'][1]` and `[2]`).\n", + "\n", + "The `training_step` function also directly evaluates and returns the loss. Here, we simply use an $L^2$ loss over the whole sequence, i.e. the iteration over `msteps`. This is requiring a few lines of code because we separately loop over 'x' and 'y' components, in order to normalize and compare to the ground truth values from the training data set.\n", + "\n", + "The \"learning\" happens in the last two lines via `tape.gradient()` and `opt.apply_gradients()`, which then contain the aggregated information about how to change the NN weights to nudge the simulation closer to the reference for the full chain of simulation steps." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "id": "D5NeMcLGQaxh", + "scrolled": true + }, + "outputs": [], + "source": [ + "def training_step(dens_gt, vel_gt, Re, i_step):\n", + " with tf.GradientTape() as tape:\n", + " prediction, correction = [ [dens_gt[0],vel_gt[0]] ], [0] # predicted states with correction, inferred velocity corrections\n", + "\n", + " for i in range(msteps):\n", + " prediction += [\n", + " simulator.step(\n", + " density_in=prediction[-1][0],\n", + " velocity_in=prediction[-1][1],\n", + " re=Re, res=source_res[1],\n", + " )\n", + " ] # prediction: [[density1, velocity1], [density2, velocity2], ...]\n", + "\n", + " model_input = to_keras(prediction[-1], Re)\n", + " model_input /= math.tensor([dataset.dataStats['std'][1], dataset.dataStats['std'][2], dataset.dataStats['ext.std'][0]], channel('channels')) # [u, v, Re]\n", + " model_out = network(model_input.native(['batch', 'y', 'x', 'channels']), training=True)\n", + " model_out *= [dataset.dataStats['std'][1], dataset.dataStats['std'][2]] # [u, v]\n", + " correction += [ to_phiflow(model_out, domain) ] # [velocity_correction1, velocity_correction2, ...]\n", + "\n", + " prediction[-1][1] = prediction[-1][1] + correction[-1]\n", + " #prediction[-1][1] = correction[-1]\n", + "\n", + " # evaluate loss\n", + " loss_steps_x = [\n", + " tf.nn.l2_loss(\n", + " (\n", + " vel_gt[i].vector['x'].values.native(('batch', 'y', 'x'))\n", + " - prediction[i][1].vector['x'].values.native(('batch', 'y', 'x'))\n", + " )/dataset.dataStats['std'][1]\n", + " )\n", + " for i in range(1,msteps+1)\n", + " ]\n", + " loss_steps_x_sum = tf.math.reduce_sum(loss_steps_x)\n", + "\n", + " loss_steps_y = [\n", + " tf.nn.l2_loss(\n", + " (\n", + " vel_gt[i].vector['y'].values.native(('batch', 'y', 'x'))\n", + " - prediction[i][1].vector['y'].values.native(('batch', 'y', 'x'))\n", + " )/dataset.dataStats['std'][2]\n", + " )\n", + " for i in range(1,msteps+1)\n", + " ]\n", + " loss_steps_y_sum = tf.math.reduce_sum(loss_steps_y)\n", + "\n", + " loss = (loss_steps_x_sum + loss_steps_y_sum)/msteps\n", + "\n", + " gradients = tape.gradient(loss, network.trainable_variables)\n", + " opt.apply_gradients(zip(gradients, network.trainable_variables))\n", + "\n", + " return math.tensor(loss) \n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c4yLlDM3QfUR" + }, + "source": [ + "Once defined, we prepare this function for executing the training step by calling phiflow's `math.jit_compile()` function. It automatically maps to the correct pre-compilation step of the chosen backend. E.g., for TF this internally creates a computational graph, and optimizes the chain of operations. For JAX, it can even compile optimized GPU code (if JAX is set up correctly). Thus, using the jit compilation can make a huge difference in terms of runtime." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "K2JcO3-QQgC9" + }, + "outputs": [], + "source": [ + "\n", + "training_step_jit = math.jit_compile(training_step)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E6Vly1_0QhZ1" + }, + "source": [ + "## Training\n", + "\n", + "For the training, we use a standard Adam optimizer, and run 15 epochs by default. This should be increased for the larger network or to obtain more accurate results. For longer training runs, it would also be beneficial to decrease the learning rate over the course of the epochs, but for simplicity, we'll keep `LR` constant here.\n", + "\n", + "Optionally, this is also the right point to load a network state to resume training." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "id": "PuljFamYQksW" + }, + "outputs": [], + "source": [ + "LR = 1e-4\n", + "EPOCHS = 15\n", + "\n", + "opt = tf.keras.optimizers.Adam(learning_rate=LR) \n", + "\n", + "# optional, load existing network...\n", + "# set to epoch nr. to load existing network from there\n", + "resume = 0\n", + "if resume>0: \n", + " ld_network = keras.models.load_model('./nn_epoch{:04d}.h5'.format(resume)) \n", + " #ld_network = keras.models.load_model('./nn_final.h5') # or the last one\n", + " network.set_weights(ld_network.get_weights())\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lrALctV1RWBO" + }, + "source": [ + "Finally, we can start training the NN! This is very straight forward now, we simply loop over the desired number of iterations, get a batch each time via `getData`, feed it into the source simulation input `source_in`, and compare it in the loss with the `reference` data for the batch.\n", + "\n", + "The setup above will automatically take care that the differentiable physics solver used here provides the right gradient information, and provides it to the tensorflow network. Be warned: due to the complexity of the setup, this training run can take a while... (If you have a saved `nn_final.h5` network from a previous run, you can potentially skip this block and load the previously trained model instead via the cell above.)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m3Nd8YyHRVFQ", + "outputId": "a9ce981d-cb10-4543-8eb1-0fd820c76e40", + "scrolled": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "epoch 001/015, batch 001/002, step 0001/0496: loss=2607.0625\n", + "epoch 001/015, batch 001/002, step 0002/0496: loss=1486.0303955078125\n", + "epoch 001/015, batch 001/002, step 0003/0496: loss=791.0106201171875\n", + "epoch 001/015, batch 001/002, step 0129/0496: loss=98.65435028076172\n", + "epoch 001/015, batch 001/002, step 0257/0496: loss=75.35194396972656\n", + "epoch 001/015, batch 001/002, step 0385/0496: loss=70.05856323242188\n", + "epoch 002/015, batch 001/002, step 0401/0496: loss=19.132190704345703\n", + "epoch 003/015, batch 001/002, step 0401/0496: loss=9.645946502685547\n", + "epoch 004/015, batch 001/002, step 0401/0496: loss=7.916687965393066\n", + "epoch 005/015, batch 001/002, step 0401/0496: loss=3.710268497467041\n", + "epoch 006/015, batch 001/002, step 0401/0496: loss=3.1778054237365723\n", + "epoch 007/015, batch 001/002, step 0401/0496: loss=2.8747799396514893\n", + "epoch 008/015, batch 001/002, step 0401/0496: loss=3.5371036529541016\n", + "epoch 009/015, batch 001/002, step 0401/0496: loss=1.6915209293365479\n", + "epoch 010/015, batch 001/002, step 0401/0496: loss=1.6486291885375977\n", + "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n", + "epoch 011/015, batch 001/002, step 0401/0496: loss=1.92047119140625\n", + "epoch 012/015, batch 001/002, step 0401/0496: loss=2.0499801635742188\n", + "epoch 013/015, batch 001/002, step 0401/0496: loss=1.4348883628845215\n", + "epoch 014/015, batch 001/002, step 0401/0496: loss=1.2719428539276123\n", + "epoch 015/015, batch 001/002, step 0401/0496: loss=1.267827033996582\n", + "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n", + "Training done, saved NN\n" + ] + } + ], + "source": [ + "steps = 0\n", + "for j in range(EPOCHS): # training\n", + " dataset.newEpoch(exclude_tail=msteps)\n", + " if j0 and ib==0 and i==400): # reduce output \n", + " print('epoch {:03d}/{:03d}, batch {:03d}/{:03d}, step {:04d}/{:04d}: loss={}'.format( j+1, EPOCHS, ib+1, dataset.numBatches, i+1, dataset.numSteps, loss ))\n", + " \n", + " dataset.nextStep()\n", + "\n", + " dataset.nextBatch()\n", + "\n", + " if j%10==9: network.save('./nn_epoch{:04d}.h5'.format(j+1))\n", + "\n", + "# all done! save final version\n", + "network.save('./nn_final.h5'); print(\"Training done, saved NN\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "swG7GeDpWT_Z" + }, + "source": [ + "The loss should go down from above 1000 initially to below 10. This is a good sign, but of course it's even more important to see how the NN-solver combination fares on new inputs. With this training approach we've realized a hybrid solver, consisting of a regular _source_ simulator, and a network that was trained to specifically interact with this simulator for a chosen domain of simulation cases.\n", + "\n", + "Let's see how well this works by applying it to a set of test data inputs with new Reynolds numbers that were not part of the training data.\n", + "\n", + "To keep things somewhat simple, we won't aim for a high-performance version of our hybrid solver. For performance, please check out the external code base: the network trained here should be directly useable in [this apply script](https://github.com/tum-pbs/Solver-in-the-Loop/blob/master/karman-2d/karman_apply.py).\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0c38ne0UdIxV" + }, + "source": [ + "## Evaluation \n", + "\n", + "In order to evaluate the performance of our DL-powered solver, we essentially only need to repeat the inner loop of each training iteration for more steps. While we were limited to `msteps` evaluations at training time, we can now run our solver for arbitrary lengths. This is a good test for how well our solver has learned to keep the data within the desired distribution, and represents a generalization test for longer rollouts.\n", + "\n", + "We reuse the solver code from above, but in the following, we will consider two simulated versions: for comparison, we'll run one reference simulation in the _source_ space (i.e., without any modifications). This version receives the regular outputs of each evaluation of the simulator, and ignores the learned correction (stored in `steps_source` below). The second version, repeatedly computes the source solver plus the learned correction, and advances this state in the solver (`steps_hybrid`).\n", + "\n", + "We also need a set of new data. Below, we'll download a new set of Reynolds numbers (in between the ones used for training), on which we will later on run the unmodified simulator and the DL-powered one.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RumKebW_05xp", + "outputId": "30cd6bab-d132-427a-e5d1-bccc681fa7b0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Downloading test data (38MB), this can take a moment the first time...\n", + "Loaded test data, 4 training sims\n" + ] + } + ], + "source": [ + "fname_test = 'sol-karman-2d-test.pickle'\n", + "if not os.path.isfile(fname_test):\n", + " print(\"Downloading test data (38MB), this can take a moment the first time...\")\n", + " urllib.request.urlretrieve(\"https://physicsbaseddeeplearning.org/data/\"+fname_test, fname_test)\n", + "\n", + "with open(fname_test, 'rb') as f: data_test_preloaded = pickle.load(f)\n", + "print(\"Loaded test data, {} training sims\".format(len(data_test_preloaded)) )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rZ9h-gRddIxb" + }, + "source": [ + "Next we create a new dataset object `dataset_test` that organizes the data. We're simply using the first batch of the unshuffled dataset, though.\n", + "\n", + "A subtle but important point: we still have to use the normalization from the original training data set: `dataset.dataStats['std']` values. The test data set has it's own mean and standard deviation, and so the trained NN never saw this data before. The NN was trained with the data in `dataset` above, and hence we have to use the constants from there for normalization to make sure the network receives values that it can relate to the data it was trained with." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9OPruTGMdIxe", + "outputId": "1b5ad04d-f6ee-41f1-b94d-afee4b79f14a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Reynolds numbers in test data set: (\u001b[94m120000.0\u001b[0m, \u001b[94m480000.0\u001b[0m, \u001b[94m1920000.0\u001b[0m, \u001b[94m7680000.0\u001b[0m) along \u001b[92mbatchᵇ\u001b[0m\n" + ] + } + ], + "source": [ + "dataset_test = Dataset( data_preloaded=data_test_preloaded, is_testset=True, num_frames=simsteps, num_sims=4, batch_size=4 )\n", + "\n", + "# we only need 1 batch with t=0 states to initialize the test simulations with\n", + "dataset_test.newEpoch(shuffle_data=False)\n", + "batch = getData(dataset_test, consecutive_frames=0) \n", + "\n", + "re_nr_test = math.tensor(batch[3], math.batch('batch')) # Reynolds numbers\n", + "print(\"Reynolds numbers in test data set: \"+format(re_nr_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sMqRPg2pdIxh" + }, + "source": [ + "Next we construct a `math.tensor` as initial state for the centered marker fields, and a staggered grid from the next two indices of the test set batch. Similar to `to_phiflow` above, we use `phi.math.stack()` to combine two fields of appropriate size as a staggered grid." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "xK1MEaPqdIxi" + }, + "outputs": [], + "source": [ + "source_dens_initial = math.tensor( batch[0][0], math.batch('batch'), math.spatial('y, x'))\n", + "\n", + "source_vel_initial = domain.staggered_grid(phi.math.stack([\n", + " math.tensor(batch[2][0], math.batch('batch'),math.spatial('y, x')),\n", + " math.tensor(batch[1][0], math.batch('batch'),math.spatial('y, x'))], channel('vector')))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KhGVceo6dIxl" + }, + "source": [ + "Now we first run the _source_ simulation for 120 steps as baseline:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nbTTl15kdIxl", + "outputId": "43c6ba5e-0152-4176-a037-1b38ab5f42dc" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Source simulation steps 121\n" + ] + } + ], + "source": [ + "source_dens_test, source_vel_test = source_dens_initial, source_vel_initial\n", + "steps_source = [[source_dens_test,source_vel_test]]\n", + "\n", + "# note - math.jit_compile() not useful for numpy solve... hence not necessary\n", + "for i in range(120):\n", + " [source_dens_test,source_vel_test] = simulator.step(\n", + " density_in=source_dens_test,\n", + " velocity_in=source_vel_test,\n", + " re=re_nr_test,\n", + " res=source_res[1],\n", + " )\n", + " steps_source.append( [source_dens_test,source_vel_test] )\n", + "\n", + "print(\"Source simulation steps \"+format(len(steps_source)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vQV0qV5pdIxm" + }, + "source": [ + "Next, we compute the corresponding states of our learned hybrid solver. Here, we closely follow the training code, however, now without any gradient tapes or loss computations. We only evaluate the NN in a forward pass for each simulated state to compute a correction field:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fH5tFfh9dIxn", + "outputId": "65f77439-b20d-4855-f084-25393393934d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Steps with hybrid solver 121\n" + ] + } + ], + "source": [ + "source_dens_test, source_vel_test = source_dens_initial, source_vel_initial\n", + "steps_hybrid = [[source_dens_test,source_vel_test]]\n", + " \n", + "for i in range(120):\n", + " [source_dens_test,source_vel_test] = simulator.step(\n", + " density_in=source_dens_test,\n", + " velocity_in=source_vel_test,\n", + " re=math.tensor(re_nr_test),\n", + " res=source_res[1],\n", + " )\n", + " model_input = to_keras([source_dens_test,source_vel_test], re_nr_test )\n", + " model_input /= math.tensor([dataset.dataStats['std'][1], dataset.dataStats['std'][2], dataset.dataStats['ext.std'][0]], channel('channels')) # [u, v, Re]\n", + " model_out = network(model_input.native(['batch', 'y', 'x', 'channels']), training=False)\n", + " model_out *= [dataset.dataStats['std'][1], dataset.dataStats['std'][2]] # [u, v]\n", + " correction = to_phiflow(model_out, domain) \n", + " source_vel_test = source_vel_test+correction\n", + "\n", + " steps_hybrid.append( [source_dens_test, source_vel_test] )\n", + " \n", + "print(\"Steps with hybrid solver \"+format(len(steps_hybrid)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tnHYeOfldIxp" + }, + "source": [ + "Given the stored states, we quantify the improvements that the NN yields, and visualize the results. \n", + "\n", + "In the following cells, the index `b` chooses one of the four test simulations (by default index 0, the lowest Re outside the training data range), and computes the accumulated mean absolute error (MAE) over all time steps.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 316 + }, + "id": "bU-PwcCCdIxq", + "outputId": "932e00dd-b261-4eaf-d5ab-ca48729efc57" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "MAE for source: 0.13729144632816315 , and hybrid: 0.045980848371982574\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deVxVdf748dcbZBNXQNkRcsldDJRcpmyznGna+7ZNWdk07TXm1ywrcsu0mjJzKhvLcnLKKeebv2mbNK3UXMAlFXNH2UFQQXbu/fz+OFcGFRWTy4V738/Hgwf33PM5974PB+6bz3I+HzHGoJRSSp3Iy9UBKKWUap40QSillKqXJgillFL10gShlFKqXpoglFJK1auVqwNoLCEhISY2NtbVYSilVIuSmpp60BjTqb59bpMgYmNjSUlJcXUYSinVoojI/lPtc2oTk4hcJSI7RGS3iEyoZ/9YEUkTkZ9FZJmIdKmzzyYimxxfS5wZp1JKqZM5rQYhIt7AHOAKIBNYLyJLjDFpdYptBBKNMWUi8iAwE7jFsa/cGBPvrPiUUkqdnjNrEIOB3caYvcaYKuBj4Nq6BYwxy40xZY7NNUCUE+NRSil1FpzZBxEJZNTZzgSSTlN+DPBVnW1/EUkBaoCXjDH/d+IBInI/cD9ATEzMSS9YXV1NZmYmFRUVZx+9G/P39ycqKgofHx9Xh6KUasaaRSe1iPwBSAQurvN0F2NMloicB3wnIluMMXvqHmeMmQvMBUhMTDxpUqnMzEzatm1LbGwsIuLEM2g5jDEUFhaSmZlJXFycq8NRSjVjzmxiygKi62xHOZ47johcDkwErjHGVB573hiT5fi+F1gBDDzbACoqKggODtbkUIeIEBwcrLUqpdQZOTNBrAe6i0iciPgCtwLHjUYSkYHAO1jJIb/O8x1FxM/xOAQYBtTt3G4wTQ4n05+JUu7FZnPOrNxOSxDGmBrgEeAbYDuwyBizTUQmi8g1jmIvA22Af54wnLUXkCIim4HlWH0QvypBKKWUu/rllwrGjNnPiBE7ccbSDU7tgzDGfAl8ecJzz9d5fPkpjlsN9HNmbE1p2rRpLFy4EG9vb7y8vHjnnXdISjpdf71SSp3a2rWlzJyZx7/+dRhjwMsLtm2roG/fgEZ9n2bRSe3OfvrpJ/7973+zYcMG/Pz8OHjwIFVVVef0mjU1NbRqpZdOKU9SUWFn0aJDvPlmAevXW3cH+PoK99wTzLhxnenWzb/R31Mn63OynJwcQkJC8PPzAyAkJISIiAiWLVvGwIED6devH/feey+VlVb/fGxsLAcPHgQgJSWFESNGAPDCCy9w5513MmzYMO68807y8vK4/vrrGTBgAAMGDGD16tUA/P3vf2fw4MHEx8fzpz/9CZvN1vQnrZRqNBkZVTzzTBbR0VsZPXo/69eX0bGjN+PHh5Ke3pe3345xSnIAD6pBiGxwyusac8Fp948cOZLJkyfTo0cPLr/8cm655RaSkpK4++67WbZsGT169OCuu+7irbfe4oknnjjta6WlpbFy5UoCAgK45ZZbuPjii/nXv/6FzWbj6NGjbN++nU8++YRVq1bh4+PDQw89xEcffcRdd93VmKeslGoCGzeW8eKLuSxefBi73XouPj6ARx/txK23BtG6tfP/v/eYBOEqbdq0ITU1lR9//JHly5dzyy238PTTTxMXF0ePHj0AGD16NHPmzDljgrjmmmsICLDaGL/77js+/PBDALy9vWnfvj0LFiwgNTWVQYMGAVBeXk7nzp2deHZKqca2YUMZkyfn8PnnRwBo1QpuuaUjjzzSiSFDApt0FKLHJIgz/afvTN7e3owYMYIRI0bQr18/5syZc8qyrVq1wu74d+HEexUCAwNP+z7GGEaPHs306dPPPWilVJMxxvDjj0eZPj2Pr78uBiAgQHjwwU48+WRnIiJ8XRKX9kE42Y4dO9i1a1ft9qZNm+jatSvp6ens3r0bgAULFnDxxdZN5LGxsaSmpgLw2WefnfJ1L7vsMt566y0AbDYbR44c4bLLLuPTTz8lP9+6paSoqIj9+085k69SysVsNsNnnx1i+PCdXHzxLr7+upjWrb0YO7Yze/f25dVXo1yWHEAThNMdPXqU0aNH07t3b/r3709aWhovvfQS77//PjfffDP9+vXDy8uLBx54AIDk5GQef/xxEhMT8fb2PuXrzpo1i+XLl9OvXz8SEhJIS0ujd+/eTJ06lZEjR9K/f3+uuOIKcnJymupUlVINdPSojddey6Nbt23cdNM+Vq8uJSjIm+TkMA4csBJDWJjr50oTZ9xc4QqJiYnmxAWDtm/fTq9evVwUUfOmPxulmt7hwzW8+WYBr72WT1GRNcKwa1c/Hn+8E/fcE0ybNqf+p9BZRCTVGJNY3z6P6YNQSilXKSmx8dpr+bz6ah7FxVYf49ChgYwfH8rVV7fH27t5Tn+jCUIppZykvNzOW28VMH16HgcP1gBw6aVtefbZMEaMaNPs50XTBKGUUo2spMTG228f5NVX88jLsxLDsGGBvPhiBBdd1NbF0TWcJgillGokR4/aeOONAl59Na+2j+GCCwKYMiWCUaPaNfsaw4k0QSil1DmqrLTzzjsHmTYtl/z8/9YYnn02jCuvbHmJ4RhNEEop9SvZ7YaPPz7ExInZpKdbk3AmJbVm2rQILr20bYtNDMfofRBO1qZNm+O258+fzyOPPHLaY0aMGMGJQ3brk5KSwmOPPVbvvrqT/imlGpcxhv/8p5jBg3dwxx3ppKdX0aePP59/fh4//XQ+l13WcmsNdWkNooWqqakhMTGRxMR6hy8rpZzAZjN8+ukhZszIY+PGcgDCw32YMiWcu+8ObrbDVX8trUG4SElJCXFxcVRXVwNQXFx83PaCBQuIj4+nb9++rFu3Djh5yu8VK1Zw9dVXA1BYWMjIkSPp06cP9913n1NWl1LKU9lshoULi+jdO41bb01n48ZyQkNbMX16BLt29WbMmBC3Sw7gQTUImeSci2eST/9BXF5eTnx8fO12UVER11xzDW3btmXEiBF88cUXXHfddXz88cfccMMN+PhYt9eXlZWxadMmfvjhB+699162bt0KHD/l94oVK2pfd9KkSQwfPpznn3+eL774gnnz5jX+ySrlYex2w2efHeaFF3JIS7MmzzzvPF/Gjw9l9Ohg/P3d+39sj0kQrhIQEMCmTZtqt+fPn1/bv3Dfffcxc+ZMrrvuOt5//33efffd2nK33XYbABdddBHFxcUcPnwYOH7K77p++OEHFi9eDMDvfvc7Onbs6LRzUsrdGWP4/PMjJCfn8PPPVlNSly6+PPdcGHfdFYyPj/vVFurjMQniTP/pu8KwYcNIT09nxYoV2Gw2+vbtW7vvxA6uY9tnmvJbKfXr1dQYFi06xMsv57Fpk5UYIiN9mDgxjDFjgvH1de8aw4k862ybobvuuovbb7+de+6557jnP/nkEwBWrlxJ+/btad++/Wlf56KLLmLhwoUAfPXVVxw6dMg5ASvlhioq7MyenU+3btu44450Nm0qJyysFW+8EcXu3X148MFOHpccwINqEM3VHXfcwbPPPlvbpHSMv78/AwcOpLq6mvfee++Mr5OcnMxtt91Gnz59GDp0KDExMc4KWSm3UVVlZ968QqZNyyUryxog0qOHH+PGhXLnnUFu38dwJjrdt4t9+umnfP755yxYsKBJ37cl/GyUcpaaGsOHHxYyeXIu+/dbN7gNGBBAcnI4117bHi8vz+hjAJ3uu9l69NFH+eqrr/jyyy9dHYpSHsFuN3zyySGSk3PYtasSgN69/Zk8OZzrr+/gUYmhITRBuNDs2bNdHYJSHsEYwxdfFDNxYnbtqKSuXf2YNCmcW2/t6Jb3MDQGt08Qxhi3uOW9MblLs6JSDfHDDyU880w2q1aVAhAV5UNycjijR3vOcNVfy60ThL+/P4WFhQQHB2uScDDGUFhYiL+/v6tDUcqpNm0q45lnsvnqq2IAQkJaMXFiGA88EOLxnc8N5dYJIioqiszMTAoKClwdSrPi7+9PVFSUq8NQyilycqp55pks5s8vAqBtWy/GjQvlz3/uTNu2Tb/mc0vm1gnCx8eHuLg4V4ehlGoClZV2Xn89n6lTczl61I6vr/DII514+ukwQkLc+qPOafSnppRq8b79tphHHslg505rZNI117Tn1Vcj6dZNm1LPhSYIpVSLlZlZxdixmfzzn9ZcZeef78cbb0QzcmQ7F0fmHjRBKKVanKoqO7NmFTBpUg6lpXZat/bi+efD+POfO3vklBjO4tSfpIhcJSI7RGS3iEyoZ/9YEUkTkZ9FZJmIdKmzb7SI7HJ8jXZmnEqplmPlyqPEx//C+PFZlJbaueGGDmzf3punngrT5NDInPbTFBFvYA4wCugN3CYivU8othFINMb0Bz4FZjqODQKSgSRgMJAsIjp/tVIerKzMzhNPZHDRRTvZvr2C7t39+Prrbnz22XnExPi6Ojy35Mx0OxjYbYzZa4ypAj4Grq1bwBiz3BhT5thcAxwbe3kl8K0xpsgYcwj4FrjKibEqpZqxlSuP0r//dmbNKsDLC559NowtW3px5ZXa1+BMzuyDiAQy6mxnYtUITmUM8NVpjo088QARuR+4H9DZS5VyQ+XldiZOzOb11/MxBvr182f+/FguuKC1q0PzCM2ik1pE/gAkAhefzXHGmLnAXLBmc3VCaEopF1mzppS7705nx45KvL1hwoQwnn9e+xmakjMTRBYQXWc7yvHccUTkcmAicLExprLOsSNOOHaFU6JUSjUr5eV2nnsum9dey8duh169/Pnggy4MGqSrKTY1Z6bi9UB3EYkTEV/gVmBJ3QIiMhB4B7jGGJNfZ9c3wEgR6ejonB7peE4p5cZWrTrKgAHbefVV6+Ng/PhQNmzoqcnBRZxWgzDG1IjII1gf7N7Ae8aYbSIyGUgxxiwBXgbaAP90TKZ3wBhzjTGmSESmYCUZgMnGmCJnxaqUcq2aGsOUKTlMnZqL3Q59+vjz/vtaa3A1t15RTinV/O3bV8kdd6Tz00+liMBTT4Xywgvh+PlpX0NT0BXllFLNjjGGv/+9iIcfzqCkxE5kpA9//3ssI0a0dXVoykEThFKqyRUV1fDggwdYtMiaQ+mGGzrw7rsxBAXpR1JzoldDKdWkvv76CPfdd4CsrGratPFi9uxoRo8O0kW9miFNEEqpJlFSYuPJJzN5991CAIYMCWTBgli6dvVzcWTqVDRBKKWcbvXqo9xxRzrp6VX4+gpTpoTz5JOheHtrraE50wShlHKamhrDtGm5TJ6cg90OF1wQwIcfxtKnT4CrQ1MNoAlCKeUU+/ZVcued6axaZQ1fnTAhlEmTwnWqjBZEE4RSqlEZY/jwwyIefdQavhoR4cOCBbFceqkOX21pNEEopRrNoUM1/OlPB2qXAL3xxg68804MwcH6UdMS6VVTSjWKH34o4Y470snMtIavvvlmNHfdpcNXWzJNEEqpc1JTY5g8OYdp06x5lJKSWrNwYRznnafDV1s6TRBKqV8tI6OK22/fx8qVVkf0xIlhJCeH4+OjtQZ3oAlCKfWrLFlymHvu2U9RkY2ICB8++kjnUXI3Ot5MKXVWysvtPPpoBtdeu5eiIhujRrVj06aemhzckNYglFIN9vPPZdx2WzppaRX4+AgvvhjB2LGd8fLSJiV3pAlCKXVGdrvhjTcKeOqpLKqqDD16+LFwYRwJCa1dHZpyIk0QSqnTys6u4u679/PttyUA/PGPwbz2WhSBgd4ujkw5myYIpdQpLV58iD/+8QBFRTaCg72ZN68L117bwdVhqSaiCUIpdZLiYhuPP57B/PnWUvBXXtmO99/vQni4j4sjU01JE4RS6jg//niU0aPT2bevCn9/YebMSB5+uJN2RHsgTRBKKQDKyuw880wWb7xRgDEQHx/ARx/F0ru3Ts3tqTRBKKVYufIod9+9nz17KvH2hqefDuO558J0am4PpwlCKQ9WUWHnueeyefXVfIyBvn39mT8/VoevKkAThFIeKyWllNGj95OWVoGXl7WgT3JyOH5+WmtQFk0QSnmYkhIbzz2XzezZBdjt0KOHHx9+GEtSUqCrQ1PNjCYIpTyEMYYlS47w6KMZZGRU4+UFTz7ZmcmTI2jdWmsN6mSaIJTyALt3V/DYY5l89VUxAAkJrXn33RgGDtS+BnVqmiCUcmMVFXZefDGXGTPyqKoytGvnxZQpETz8cCe8vfW+BnV6miCUclPLlhXzwAMZ7N5dCcDo0UHMmBFJaKjeDa0aRhOEUm4mJ6ea8eOz+PvfrWkyevf25513Yhg+vI2LI1MtjSYIpdxEdbXhzTfzSU7OoaTEjr+/8Nxz4Ywb11lveFO/ilN/a0TkKhHZISK7RWRCPfsvEpENIlIjIjedsM8mIpscX0ucGadSLd2yZcUMHLidsWOzKCmx8/vft2fr1t4884zeDa1+PafVIETEG5gDXAFkAutFZIkxJq1OsQPA3cC4el6i3BgT76z4lHIH6emVjBuXxWefHQbgvPN8mTUrmquvbu/iyJQ7cGYT02BgtzFmL4CIfAxcC9QmCGNMumOf3YlxKOV2SkttzJiRx8sv51FRYWjd2ouJE8MYO7Yz/v5aY1CNw5kJIhLIqLOdCSSdxfH+IpIC1AAvGWP+78QCInI/cD9ATEzMOYSqVMtgtxs+/vgQ48dnkZVVDcDtt3dk5sxIIiN9XRydcjfNuZO6izEmS0TOA74TkS3GmD11Cxhj5gJzARITE40rglSqqXz/fQnjxmWRklIGWDe7vfFGFEOH6ugk5RzOTBBZQHSd7SjHcw1ijMlyfN8rIiuAgcCe0x6klBtKSytnwoRs/t//OwJAeLgPU6aEc889wbqIj3IqZyaI9UB3EYnDSgy3Arc35EAR6QiUGWMqRSQEGAbMdFqkSjVDWVlVJCfn8P77hdjt0KaNF+PHhzJ2bGcCA71dHZ7yAE5LEMaYGhF5BPgG8AbeM8ZsE5HJQIoxZomIDAL+BXQEfi8ik4wxfYBewDuOzmsvrD6ItFO8lVJu5fDhGmbOzOP11/MpLzd4e8ODD4aQnByud0GrJiXGuEfTfWJioklJSXF1GEr9ahUVdt56q4CpU3MpKrIBcOONHXjxxQh69PB3cXTKXYlIqjEmsb59zbmTWimPUFNj+OCDQiZNyiEjwxqZdPHFbZgxI1LXaFAupQlCKRcxxrB48WEmTsxmxw5rQr3+/QOYPj2CUaPaIaId0Mq1NEEo5QLLl5cwYUIW69ZZQ1a7dvVj8uRwbr21o45MUs2GJgilmtCaNaU891w2S5eWABAa2ork5HDuuy8EHx9NDKp50QShVBNITS3j+eez+fJLa0W3du28+N//DeWJJzrTpo0OWVXNkyYIpZxo8+YykpNz+Pxz6ya3wEAvHn+8E08+GUpQkP75qeZNf0OVcoKdOyt47rlsFi2yZlkNCBAefrgT48eH0qmT3sugWoYzJggR8QIuNMasboJ4lGrRsrOrmDw5l7/97SA2G/j5CQ8+2ImnngolLEwTg2pZzpggjDF2EZmDNReSUqoeWVlVvPRSHu++e5DKSoOXF4wZE8wLL4QTFaWzrKqWqaFNTMtE5EZgsXGXW6+VagQ5OdW8+GIuc+cepKrK+tO48cYOTJkSTq9eAS6OTqlz09AE8SdgLGATkXJAAGOMaee0yJRqxvLzq5kxI4+//rWAigqDCNx8cweeey6cfv00MSj30KAEYYxp6+xAlGoJSktt/OUv+cycmcfRo9ZCiDfc0IFJk8Lp21cTg3IvDR7FJCLXABc5NlcYY/7tnJCUan4qK+28/741X1Jubg0Av/1tO6ZOjWDgwNYujk4p52hQghCRl4BBwEeOpx4XkWHGmKedFplSzUBpqY25cw/yyiv5ZGdbE+kNGtSamTMjGTFCK9bKvTW0BvFbIN4YYwcQkQ+AjYAmCOWWjh61MWdOAa+8ks/Bg1aNoV8/f557LpybbuqgE+kpj3A2N8p1AIocj9s7IRalXK601Mbs2QW88koehYXWmgyDB7dm4sQwrr66vU6kpzxKQxPEi8BGEVmONYLpImCC06JSqolVVdn5298KmTw5h7w8q8YwZEggycnhjBzZVmsMyiM19E5qO3AhVj8EwFPGmFxnBqZUU6iosDN/fiEvv5zH3r1VgNXHMG1aBJdfrolBebaG3kk93hizCFjSBDEp5XTFxTb++tcCXn89v7bG0LOnH9OmRXD99drHoBQ0vIlpqYiMAz4BSo89aYwpOvUhSjU/xcU2Zs/O59VX8zl0yOpjuOCCAJ56Kowbb+yAt7cmBqWOaWiCuMXx/eE6zxngvMYNRynnqC8x/OY3bXj22TCuuEKbkpSqT0P7ICYYYz5pgniUalRHjlhNSa+8kkdR0X8Tw6RJ4YwY0UYTg1Kn0dA+iP/Fal5SqkXIzKxi1qx83nnnICUl1pQYw4cHMmlSBJdcoolBqYbQPgjlVnbvrmD69Dw+/LCQGqvvmREj2jBxYhiXXaZNSUqdDe2DUG5h27Zypk/P5R//OITdDl5e8D//04H//d9QEhMDXR2eUi1SQ2dzjXN2IEr9GmvWlDJ9ei5LllhrPrdqBXffHcyECaF07+7v4uiUatm8TrdTRMbXeXzzCftedFZQSp2O3W744osjjBixkyFDdrBkyRH8/YWHHgph9+4+zJvXRZODUo3gtAkCuLXO4xMn5ruqkWNR6rSqqqy7nvv1287VV+/h+++P0q6dF08/HUp6el/mzImhSxc/V4eplNs4UxOTnOJxfdtKOcXRozbeffcgf/lLPpmZ1pTbkZE+/PnPnfnjH0No187bxREq5Z7OlCDMKR7Xt61Uoyovt/PXvxYwY0YeBQXWkKTevf0ZPz6U227riK/vmSrASqlzcaYEMUBEirFqCwGOxzi2tZFXOUVVlZ133y1k2rRccnKsGkNSkjXl9u9+p1NuK9VUTpsgjDFad1dNxmYzLFxYRHJyDvv2WTOrXnBBAFOmRDBqVDu9h0GpJubUOrqIXCUiO0Rkt4ictH6EiFwkIhtEpEZEbjph32gR2eX4Gu3MOJVrGWP4/PPDxMdv56679rNvXxW9evnz2WdxpKT05Le/ba/JQSkXOJsV5c6KiHgDc4ArgExgvYgsMcak1Sl2ALgbGHfCsUFAMpCI1deR6jj2kLPiVa6xfHkJEyZksW5dGQAxMb5MmhTOnXcG6cyqSrmY0xIEMBjYbYzZCyAiHwPXArUJwhiT7thnP+HYK4Fvj03lISLfYg2r/YcT41VNaNeuCsaNy6q9wa1z51Y8+2wY998fgp+fdj4r1Rw4M0FEAhl1tjOBpHM4NvLEQiJyP3A/QExMzK+LUjWpI0dsTJ2aw6xZBVRXG9q08WLChFCeeKIzgYHa5aVUc+LMBOF0xpi5wFyAxMREHXbbjNlshnnzCnn22WwKCmoQgXvvDWbq1AjCw31cHZ5Sqh7OTBBZQHSd7SjHcw09dsQJx65olKhUk1uxooQnnshk8+ZywJp2+/XXo0lIaO3iyJRSp+PMxt71QHcRiRMRX6xpOxq6pvU3wEgR6SgiHYGRjudUC7J3byU33LCHSy7ZxebN5cTE+PLJJ3H88EMPTQ5KtQBOq0EYY2pE5BGsD3Zv4D1jzDYRmQykGGOWiMgg4F9AR+D3IjLJGNPHGFMkIlOwkgzAZF17ouUoK7MzfXouM2fmUVVlaN3ami/pySdDCQjQDmilWgoxxj2a7hMTE01KSoqrw/Boxhj+9a/D/PnPWRw4YN3o9oc/BPHSSxFERvq6ODqlVH1EJNUYk1jfvhbdSa2aj7S0ch5/PJOlS0sAiI8P4M03oxk2rI2LI1NK/VqaINQ5OXLExgsv5DB7dj42G3Ts6M3UqRH86U8heqObUi2cJgj1qxhj+PjjQ4wdm0lurjVs9YEHQpg6NYLgYP21Usod6F+yOms7dlTw8MMZLFtmNScNGRLInDnRDByoI5OUcieaIFSDlZdbo5NmzLBGJwUFeTNzZiT33BOsU3Ar5YY0QagG+c9/innooQz27KkEYMyYYF56KZKQEP0VUspd6V+3Oq3c3GrGjs3kH/+wJtLt29eft9+O0dFJSnkATRCqXna74d13D/LUU9kcOWIjIEBITg5n7NhQfHy0OUkpV6u2VfNz3s+szVrL/sP7mXHFjEZ/D00Q6iRbt5bzpz8dYPXqUgBGjWrHnDnRxMX5uTgypTxXQWkBazLXsCpjFasyVpGSnUJFTUXt/qd/8zQd/Ds06ntqglC1ysrsTJ2aw8sv51FTA2FhrZg1K5qbb+6gK7op1YQKywpZn72edVnr2JCzgQ05G8gozjipXI/gHiRFJpEUmYTQ+H+jmiAUAF99dYSHH85g374qRODBB0N48cUIOnTQXxGlnKnKVsX2gu21tYPVGavZc2jPSeUCfQJJiEhgWPQwhkUP48KoCwluHezU2PSv38NlZ1fxxBOZ/POfhwHo3z+At9+OZsgQ7YRWqjEZY8gszmRT7iY2521mc95mtuZvZVfhLmzGdlzZgFYBJEQkMChiEAnhCSREJNA9qDveXk27qJYmCA9lsxneeecgTz+dRXGxncBALyZPDuexxzrTqpU2Jyl1LowxpB9OZ3PeZjblbmJ99nrWZ62noKzgpLKC0C2oG4MiBjE0eihDo4fSP7Q/rbxc//Hs+ghUk9uypZw//nE/a9eWAfD737fnzTejiYnRGVeVOlvVtmrSCtLYmLuRjTkb2Zi7kc15mymuLD6pbFBAEAPDBhIfFs+A0AH07dyXniE9CfAJcEHkZ6YJwoNUVNiZOjWXGTNyqamBiAgfZs+O4vrrtRNaqYYory5nS/6W2kSwIWcDP+f9TKWt8qSyoYGhDAgbwIDQASRGJDIoYhCxHWJb1N+aJggP8f33Jdx//wF27rR+kR98MITp0yNp375p2zSVainyS/NJzU4lNSeVzXmb+TnvZ3YX7cZu7CeV7dqxKxeEX8DAsIEMDLdqCGFtwlwQdePSBOHmiopqGD8+i3nzCgHo1cufd9/VO6GVOuZo1VF2Fe5iR+EOtuRtYVPeJjbnbiarJOukst7iTZ9OfRgYPtBKBo6E0Nj3HzQXmiDclDGGRYsO8XIap9YAABgVSURBVPjjmeTl1eDrK0ycGMZTT4Xi56fLfirPU1BawPaD29lesJ20gjTr8cHtZBZn1lu+jW8bBoYNrK0ZDAgbQK+QXvi18pwbRjVBuKEDB6p46KEDfPGF1Un2m9+0Ye7cGHr29HdxZEo5V3l1OXsO7WFX4S52Fu5kR+EO6+vgDgrLC+s9xtfbl25B3Tg/+Hx6d+pd24HcNagrXuLZ/0xpgnAjdrvh7bcP8tRTWRw9aqd9e29efjmSMWN0Om7lPowxZJVk8cvBX9hesJ0dhTvYWbiTnYU7OXDkAAZT73FtfNvQK6QXvTr1ondIb3p36k2vTr2I6xDX5PcXtBSaINzEzp0V3HffAX788SgAN97YgdmzowkP93FxZEr9eoVlhWzJ38KWvC1syd/C1vytbCvYVu8QUrD6CM7reB49gnvQPag754ecT4/gHvQI7kFk28gWNYKoOdAE0cLV1Bheey2f55/PpqLCEBrair/+NZobbujo6tCUarCC0gKrRnDQ6h/YVrCNbfnbyDmaU2/54IBgenXqRc/gnvQM6VmbCOI6xOHjrf8UNRZNEC3Yli3l3HvvflJSrBve7roriNdeiyIoSC+ran6MMWQUZ5BWkGZ1Ehds55dCq5noVP0DrX1a07dzX/p17ke/zv3o27kvfTv3pXNgZ60NNAH9JGmBqqsN06fnMnVqLtXVhqgoH+bOjWHUqPauDk0piiuLrQ7igzuO6yjeWbiTsuqyeo9p69vWqhGE9KRXSC/6dOpDn859iO0Q6/Edxa6kCaKF2bixjHvu2c/mzeUAPPBACDNmRNKunXayqaZTXl1e2zG8s3AnO4t2srtoN7sKd9U739AxnQM7W53DIb1qO4x7hfQiom2E1giaIU0QLURlpTVNxksvWdNkxMX5Mm9eFy65pK2rQ1Nu7FD5odq+gbp9BPsO7TvlaCH/Vv50D+pOj+AenB98PueHnM/5wVYfQccA7RtrSTRBtADr1pVy77372batAhF49NFOTJ8eQWCg1hrUuTPGkFeax/aC7Wwr2MbW/K2kFaSxo3AH+aX59R7jLd7WvQMh59MjqAfdg7vTPag73YO7E9E2QpuF3IQmiGasstLOCy/kMHNmHnY7dO/ux3vvdWH4cJ0mQ/06B8sOsjnXWofg2JDR7Qe3c7jicL3lW/u0pkdwj9omoZ4hPendqTfdg7vj662z/7o7TRDN1IYNZYwenc7WrVat4cknOzN5cgStW+t/ZurMjq1HsCl3E5tyN1lTUeduPOW0Eh38O9AzpKfVOezoIO4V0ovIdpFaG/BgmiCamWMjlKZMyaGmBrp182P+/C46uZ46Jbuxs6twF+uy1pGak1qbFI5UHjmpbKBPIAPCBtQOGe3TqQ+9OvUiNDBUO4nVSTRBNCNpaeXcddd+UlOtoYDa16Dqk1WcVbug/bGVyupLBp0DO9cuThMfFs/AsIF0D+6uNQLVYE5NECJyFTAL8Ab+Zox56YT9fsCHQAJQCNxijEkXkVhgO7DDUXSNMeYBZ8bqSna74fXX83nmmWwqKw1duvjy3ntduPRSHaHk6Yori0nJTmFd1rrar/qmoY5sG8ngyMEkhCfUTkUd3jbcBRErd+K0BCEi3sAc4AogE1gvIkuMMWl1io0BDhljuonIrcAM4BbHvj3GmHhnxddc7N9fyd1372fFCmsOpTFjgvnLX6L0vgYPZLPb2FawjTWZa2q/fjn4y0nDSdv7tScxIpHBkYMZFDGIwZGDiWwX6aKolTtzZg1iMLDbGLMXQEQ+Bq4F6iaIa4EXHI8/Bd4UD2kINcbw0UdFPPxwBsXFdjp3bsW8eV24+mq9G9pTFJYV8lPmT6zOWM2azDWsy1pHaXXpcWV8vX2JD4uvTQRJkUnaTKSajDMTRCSQUWc7E0g6VRljTI2IHAGCHfviRGQjUAw8a4z58cQ3EJH7gfsBYmJiGjd6Jzp8uIaHHsrgH/84BMB117Vn7twYOnXSScbcld3Y+eXgL6zOWF37taNwx0nlYjvEMiRqCBdGXUhSZBLxYfEetUCNal6aayd1DhBjjCkUkQTg/0SkjzHmuDl+jTFzgbkAiYmJ9d/W2cysXHmUO+5I58CBKgIDvZg1K4p77w3WESRu5nDFYdZlreOnjJ/4KfMn1matPeleA/9W/gyKGMTQ6KG1SSG0TaiLIlbqZM5MEFlAdJ3tKMdz9ZXJFJFWQHug0BhjgEoAY0yqiOwBegApTozXqWpqDNOm5TJ5cg52OyQmtmbhwli6d9dV3lq6als1W/K3sDZzLeuy17E2cy3bD24/qVxk20iGRg+tTQgDwwfqzWaqWXNmglgPdBeROKxEcCtw+wlllgCjgZ+Am4DvjDFGRDoBRcYYm4icB3QH9joxVqfKyKjijjvS+fHHo4jAhAmhTJ4cgY+P1hpammP3HBwbXro+ez0bczdSUVNxXDlfb18SwhNIikxiSPQQhkQNIbp99CleVanmyWkJwtGn8AjwDdYw1/eMMdtEZDKQYoxZAswDFojIbqAIK4kAXARMFpFqwA48YIwpclaszvTvfx9h9Oh0iopshIf7sGBBFy67rJ2rw1INYIxhz6E9pGSnkJqdSmpOKhtyNtR7z0H3oO4kRSUxOGIwSVFJDAgdoH0HqsUTqzWn5UtMTDQpKc2nBaq62jBxYhYvv2xNdjZqVDs++KCLdkQ3Y4crDrM+az1rs9bWDjOtbyGbiLYRDIoYVDuyKDEiUWcpVS2WiKQaYxLr29dcO6lbtNzcam6+eS8rV5bi7Q0vvhjBuHGheHlpk1JzUWWrYlPuptq7kddlreOXg7+cVK5zYOfaG9ASwhNIiEggom2ECyJWqulpgmhka9aUcuONe8nOriYy0odPPonTeZRczBjD/iP7WZu5trZ2sCFnA5W2yuPK+Xr7MjBsIEmRSSRFJTEkagixHWJ1hJnyWJogGtG8eQd58MEMqqsNF13UhkWL4ggN1SalplZUXsSGnA21CWFd1jrySvNOKtczpCdJkUm1dyT3D+2v/QZK1aEJohHY7YYJE/7b3/DYY5145ZUoHaXUBI4lg5TsFFJzUknNTmXf4X0nlQsKCLJqBo5RRYMjB9PBv4MLIlaq5dAEcY7KyuzceWc6ixcfplUrePvtGMaMCXF1WG7pSMURUnNSa5NBSnYKew+dPPrZv5U/8WHxtSOKBkcOpmvHrtpUpNRZ0gRxDg4dqmHUqN2sXVtG+/befPZZnA5hbSSFZYXWIjc51kI3qTmp7CzceVK5Y8kgMTyRhAirI7lXp1608tJfbaXOlf4V/Ur5+dWMHLmbzZvL6dLFly+/7Erv3gGuDqvFMcaQWZxJSnYKKdkpbMzdyOa8zWSXZJ9U9tjEdQnhCQyKGERCRAK9O/XWZKCUk+hf1q+QnV3F5ZfvZvv2Cnr08GPZsu5ERemUCQ1xqPxQbcfxsbuR6+tAbu3Tmn6d+3FB+AW1X30799WpKZRqQpogzlJ+fjUjRuxi165K+vb1Z+nS7jpS6RRsdhtpBWn8lGlNWPdTxk/1zmDa0b8jiRGJJEYkckH4BQwIHUDXoK46pbVSLqYJ4iyUltr4/e/3sGtXJfHxASxd2p3gYP0RHnOo/FDt2gZrstawNnMtJVUlx5Xx8/YjIcKao2hQxCAGRQ7SDmSlmin9dGsgm81w++3prFtXRmysL1991c2jk8Oxm89WHVjFqoxVrDywkq35W09a/axL+y61k9VdGHUh8WHx2kykVAvhuZ9wZ+nxxzNZsuQIHTt689VX3QgL86xmpdKqUlKyU1iTuab2buScoznHlfH19mVw5GCGRg21FryJStJpKZRqwTRBNMDHHxcxZ04Bfn7CkiVd6dnT/ddwyC7JZtUBq2awOnM1G3M2YjO248oEBQQxNHoow6KHMTxmOIkRifi3cv+fjVKeQhPEGWRlVfHQQ9bKqbNmRTF8uPvNq1Rjr2FL3pbazuRVB1addDeyl3gxMGxg7VKYSVFJ9AjuoR3JSrkxTRCnYYxhzJgDHDpkY9Sodtx/v3vcIV1UXsSazDX8lPETqzNXszZzLaXVpceVaevbliHRQ2prB4MjB9PG1/2So1Lq1DRBnMY77xzkm2+KCQryZt68Li1ypE21rZqf835mbdZ/ZzKt747k8zqeV7sU5pCoIfQP7Y+3l7cLIlZKNReaIE4hK6uKJ5+0ltB+++0YwsNbRqf04YrDrM5YbfUdZKxmXdY6ymvKjyvj38qfxIhELoy8kGExwxgSNYTQNqEuilgp1VxpgjiFl1/Oo6zMzvXXt+fmm5vvamHZJdn8uP9HVh5YyY8HfuTnvJ9PGmp6bDnMY7OZDggboENNlVJnpAmiHnl51cydexCAF14Id3E0x0s/nM736d+zYv8Kftj/w0mzmfp4+TA4cjDDY4YzLHoYQ6KHENLaPfpOlFJNSxNEPV57LZ/ycsO117anf//WLo0lpySH5enL+W7fd3y377uTRhe19W3L0OihDI8ZzvCY4SRFJhHgo5MGKqXOnSaIExQV1TBnTgEAEyeGNfn7F5YVsjx9Ocv2LmN5+vKT5i7q4N+Bi7pcxMVdLubiLhczIGyAzmaqlHIK/WQ5wRtv5HP0qJ2RI9syaFCg09+vrLqMH/f/yLJ9y1i6dymbcjcd14cQ6BPIb7r8hktjL+XSuEuJD4vX0UVKqSahCaKOkhIbs2ZZtYdnn3VO34PNbiMlO4Wle5eydN9SVmespspWVbvf19uXYdHDuCzuMi6Nu5TEiER8vFvGCCqllHvRBFHHv/99hMOHbQwdGshvftN4N4UdOHKA/+z5D9/s+Yale5dyuOJw7T5BSIxI5LK4y7gs7jKGxwzXPgSlVLOgCaKOZcusqamvu+7cFrMvry7n+/3f8/Xur/lmzzf8cvCX4/Z37diVK867gsvPu5xL4i4hKCDonN5PKaWcQROEgzGGb7+1EsTll7c96+P3FO3hi11f8OWuL/l+//dU1FTU7mvr25ZL4y7lyq5XMrLrSLoGdW20uJVSylk0QTjs2VPJgQNVBAd7M2DAmZt47MbOuqx1LN6+mP+38/+dVEtICE/gqm5XcWXXK7kw6kLtR1BKtTiaIByWLrVqD5de2hYvr/rnXLIbO6sOrGLRtkUs/mUx2SXZtfva+7Xnqm5X8bvuv+PKblfSObBzk8StlFLOognC4Vj/w+WXtzvueWMM67PXs3DLQhZtW3TcIjkx7WO4vuf1XNfzOoZFD9NaglLKrWiCwFpO9Lvvju9/2HtoLx9s+oCFWxeyu2h3bdnYDrH8T+//4eY+N5MQntAiZ3hVSqmG0AQBbNpUTlGRjS6xPqwtXcy989/h+/3f1+4PaxPGrX1u5bZ+tzEoYpAmBaWUR9AEASxdWgxAhxve4fbFcwAIaBXAjb1vZPSA0VwSe4nevayU8jhOTRAichUwC/AG/maMeemE/X7Ah0ACUAjcYoxJd+x7GhgD2IDHjDHfOCvOpUtLYOiHbG43B2/x5i9X/oXRA0bT3r+9s95SKaWaPaclCBHxBuYAVwCZwHoRWWKMSatTbAxwyBjTTURuBWYAt4hIb+BWoA8QASwVkR7GGFtjx1lRYWdF8QL47SwA5l83nz/0/0Njv41SSrU4zlxxfjCw2xiz1xhTBXwMXHtCmWuBDxyPPwUuE6uB/1rgY2NMpTFmH7Db8XqN7qUlC6m5ahoAs0fN1uSglFIOzkwQkUBGne1Mx3P1ljHG1ABHgOAGHouI3C8iKSKSUlBQ8OuiLO2IVLdmaOWTPDL4kV/3Gkop5YZadCe1MWYuMBcgMTHRnKF4vV6453eMOZJGUKuIRo1NKaVaOmfWILKA6DrbUY7n6i0jIq2A9lid1Q05ttFEt48mMFBHKSmlVF3OTBDrge4iEicivlidzktOKLMEGO14fBPwnTHGOJ6/VUT8RCQO6A6sc2KsSimlTuC0JiZjTI2IPAJ8gzXM9T1jzDYRmQykGGOWAPOABSKyGyjCSiI4yi0C0oAa4GFnjGBSSil1amL9w97yJSYmmpSUFFeHoZRSLYqIpBpjEuvb58wmJqWUUi2YJgillFL10gShlFKqXpoglFJK1cttOqlFpADYfw4vEQIcbKRwWgpPPGfwzPP2xHMGzzzvsz3nLsaYTvXtcJsEca5EJOVUPfnuyhPPGTzzvD3xnMEzz7sxz1mbmJRSStVLE4RSSql6aYL4r7muDsAFPPGcwTPP2xPPGTzzvBvtnLUPQimlVL20BqGUUqpemiCUUkrVy+MThIhcJSI7RGS3iExwdTzOIiLRIrJcRNJEZJuIPO54PkhEvhWRXY7vHV0da2MTEW8R2Sgi/3Zsx4nIWsc1/8QxHb1bEZEOIvKpiPwiIttFZIi7X2sR+bPjd3uriPxDRPzd8VqLyHsiki8iW+s8V++1FcsbjvP/WUQuOJv38ugEISLewBxgFNAbuE1Eers2KqepAZ40xvQGLgQedpzrBGCZMaY7sMyx7W4eB7bX2Z4BvGaM6QYcAsa4JCrnmgV8bYzpCQzAOn+3vdYiEgk8BiQaY/piLTFwK+55recDV53w3Kmu7Sis9XS6A/cDb53NG3l0ggAGA7uNMXuNMVXAx8C1Lo7JKYwxOcaYDY7HJVgfGJFY5/uBo9gHwHWuidA5RCQK+B3wN8e2AJcCnzqKuOM5twcuwlpvBWNMlTHmMG5+rbHWtwlwrE7ZGsjBDa+1MeYHrPVz6jrVtb0W+NBY1gAdRCS8oe/l6QkiEsios53peM6tiUgsMBBYC4QaY3Icu3KBUBeF5SyvA+MBu2M7GDhsjKlxbLvjNY8DCoD3HU1rfxORQNz4WhtjsoBXgANYieEIkIr7X+tjTnVtz+kzztMThMcRkTbAZ8ATxpjiuvscy726zbhnEbkayDfGpLo6libWCrgAeMsYMxAo5YTmJDe81h2x/luOAyKAQE5uhvEIjXltPT1BZAHRdbajHM+5JRHxwUoOHxljFjuezjtW5XR8z3dVfE4wDLhGRNKxmg8vxWqb7+BohgD3vOaZQKYxZq1j+1OshOHO1/pyYJ8xpsAYUw0sxrr+7n6tjznVtT2nzzhPTxDrge6OkQ6+WJ1aS1wck1M42t7nAduNMX+ps2sJMNrxeDTweVPH5izGmKeNMVHGmFisa/udMeYOYDlwk6OYW50zgDEmF8gQkfMdT12Gtb67215rrKalC0WkteN3/dg5u/W1ruNU13YJcJdjNNOFwJE6TVFn5PF3UovIb7Haqb2B94wx01wcklOIyHDgR2AL/22PfwarH2IREIM1Xfr/GGNO7ABr8URkBDDOGHO1iJyHVaMIAjYCfzDGVLoyvsYmIvFYHfO+wF7gHqx/CN32WovIJOAWrBF7G4H7sNrb3epai8g/gBFY03rnAcnA/1HPtXUkyzexmtvKgHuMMSkNfi9PTxBKKaXq5+lNTEoppU5BE4RSSql6aYJQSilVL00QSiml6qUJQimlVL00QSiPJyLBIrLJ8ZUrIlmOx0dF5K9NFEO8Y8i1Us1GqzMXUcq9GWMKgXgAEXkBOGqMeaWJw4gHEoEvm/h9lTolrUEodQoiMqLOGhIviMgHIvKjiOwXkRtEZKaIbBGRrx3TmCAiCSLyvYikisg39c2cKSI3O9Ys2CwiPzju4p8M3OKoudwiIoGOef/XOSbcu9Zx7N0i8rmIrHDM/Z/clD8T5Vk0QSjVcF2x5nO6Bvg7sNwY0w8oB37nSBKzgZuMMQnAe0B9d+Y/D1xpjBkAXOOYav554BNjTLwx5hNgItbUIIOBS4CXHTOygjVN/Y1Af+BmEUl00vkqD6dNTEo13FfGmGoR2YI1NcvXjue3ALHA+UBf4FtrhgO8saaePtEqYL6ILMKaVK4+I7EmGhzn2PbHmkYB4FtHsxgishgYDjR4+gSlGkoThFINVwlgjLGLSLX57zw1dqy/JQG2GWOGnO5FjDEPiEgS1kJGqSKSUE8xAW40xuw47knruBPnx9H5cpRTaBOTUo1nB9BJRIaANb26iPQ5sZCIdDXGrDXGPI+1sE80UAK0rVPsG+BRx2RriMjAOvuuEGsN4gCslcNWOed0lKfTBKFUI3H0JdwEzBCRzcAmYGg9RV92dG5vBVYDm7Gmpe59rJMamAL4AD+LyDbH9jHrsNb1+Bn47Gxm51TqbOhsrkq1ICJyN5BojHnE1bEo96c1CKWUUvXSGoRSSql6aQ1CKaVUvTRBKKWUqpcmCKWUUvXSBKGUUqpemiCUUkrV6/8DswEKv3rKnTwAAAAASUVORK5CYII=\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "import pylab\n", + "b = 0 # batch index for the following comparisons\n", + "\n", + "errors_source, errors_pred = [], []\n", + "for index in range(100):\n", + " vx_ref = dataset_test.dataPreloaded[ dataset_test.dataSims[b] ][ index ][1][0,...]\n", + " vy_ref = dataset_test.dataPreloaded[ dataset_test.dataSims[b] ][ index ][2][0,...]\n", + " vxs = vx_ref - steps_source[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", + " vxh = vx_ref - steps_hybrid[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", + " vys = vy_ref - steps_source[index][1].values.vector[0].numpy('batch,y,x')[b,...] \n", + " vyh = vy_ref - steps_hybrid[index][1].values.vector[0].numpy('batch,y,x')[b,...] \n", + " errors_source.append(np.mean(np.abs(vxs)) + np.mean(np.abs(vys))) \n", + " errors_pred.append(np.mean(np.abs(vxh)) + np.mean(np.abs(vyh)))\n", + "\n", + "fig = pylab.figure().gca()\n", + "pltx = np.linspace(0,99,100)\n", + "fig.plot(pltx, errors_source, lw=2, color='mediumblue', label='Source') \n", + "fig.plot(pltx, errors_pred, lw=2, color='green', label='Hybrid')\n", + "pylab.xlabel('Time step'); pylab.ylabel('Error'); fig.legend()\n", + "\n", + "print(\"MAE for source: \"+format(np.mean(errors_source)) +\" , and hybrid: \"+format(np.mean(errors_pred)) )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aOQP6iCBdIxs" + }, + "source": [ + "Due to the complexity of the training, the performance varies but typically the overall MAE is ca. 160% larger for the regular simulation compared to the hybrid simulator. \n", + "The gap is typically even bigger for other Reynolds numbers within the training data range. \n", + "The graph above also shows this behavior over time.\n", + "\n", + "Let's also visualize the differences of the two outputs by plotting the y component of the velocities over time. The two following code cells show six velocity snapshots for the batch index `b` in intervals of 20 time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 310 + }, + "id": "_3f8uhIIdIxs", + "outputId": "ac76c9d2-1f79-4942-c9ea-1b45dfa810bf" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "c = 0 # channel selector, x=1 or y=0 \n", + "interval = 20 # time interval\n", + "\n", + "fig, axes = pylab.subplots(1, 6, figsize=(16, 5)) \n", + "for i in range(0,6):\n", + " v = steps_source[i*interval][1].values.vector[c].numpy('batch,y,x')[b,...]\n", + " axes[i].imshow( v , origin='lower', cmap='magma')\n", + " axes[i].set_title(f\" Source simulation t={i*interval} \")\n", + "\n", + "pylab.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 321 + }, + "id": "v2d2WTGedIxt", + "outputId": "1e017623-3339-4c25-938c-8422659e8cc6" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "fig, axes = pylab.subplots(1, 6, figsize=(16, 5))\n", + "for i in range(0,6):\n", + " v = steps_hybrid[i*interval][1].values.vector[c].numpy('batch,y,x')[b,...]\n", + " axes[i].imshow( v , origin='lower', cmap='magma')\n", + " axes[i].set_title(f\" Hybrid solver t={i*interval} \")\n", + "pylab.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ivS0SUiYdIxt" + }, + "source": [ + "They both start out with the same initial state at $t=0$ (the downsampled solution from the reference solution manifold), and at $t=20$ the solutions still share similarities. Over time, the source version strongly diffuses the structures in the flow and looses momentum. The flow behind the obstacles becomes straight, and lacks clear vortices. \n", + "\n", + "The version produced by the hybrid solver does much better. It preserves the vortex shedding even after more than one hundred updates. Note that both outputs were produced by the same underlying solver. The second version just profits from the learned corrector which manages to revert the numerical errors of the source solver, including its overly strong dissipation. \n", + "\n", + "We also visually compare how the NN does w.r.t. reference data. The next cell plots one time step of the three versions: the reference data after 50 steps, and the re-simulated version of the source and our hybrid solver, together with a per-cell error of the two:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 358 + }, + "id": "23yyfljqdIxu", + "outputId": "0d9022a2-edc7-49ec-840c-c1a78762d0c8" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "index = 50 # time step index\n", + "vx_ref = dataset_test.dataPreloaded[ dataset_test.dataSims[b] ][ index ][1][0,...]\n", + "vx_src = steps_source[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", + "vx_hyb = steps_hybrid[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", + "\n", + "fig, axes = pylab.subplots(1, 4, figsize=(14, 5))\n", + "\n", + "axes[0].imshow( vx_ref , origin='lower', cmap='magma')\n", + "axes[0].set_title(f\" Reference \")\n", + "\n", + "axes[1].imshow( vx_src , origin='lower', cmap='magma')\n", + "axes[1].set_title(f\" Source \")\n", + "\n", + "axes[2].imshow( vx_hyb , origin='lower', cmap='magma')\n", + "axes[2].set_title(f\" Learned \")\n", + "\n", + "# show error side by side\n", + "err_source = vx_ref - vx_src \n", + "err_hybrid = vx_ref - vx_hyb \n", + "v = np.concatenate([err_source,err_hybrid], axis=1)\n", + "axes[3].imshow( v , origin='lower', cmap='cividis')\n", + "axes[3].set_title(f\" Errors: Source & Learned\")\n", + "\n", + "pylab.tight_layout()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BZByQsAydIxv" + }, + "source": [ + "This shows very clearly how the pure source simulation in the middle deviates from the reference on the left. The learned version stays much closer to the reference solution. \n", + "\n", + "The two per-cell error images on the right also illustrate this: the source version has much larger errors (i.e. brighter colors) that show how it systematically underestimates the vortices that should form. The error for the learned version is much more evenly distributed and significantly smaller in magnitude.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UQTY8m6LdIxv" + }, + "source": [ + "This concludes our evaluation. Note that the improved behavior of the hybrid solver can be difficult to reliably measure with simple vector norms such as an MAE or $L^2$ norm. To improve this, we'd need to employ other, domain-specific metrics. In this case, metrics for fluids based on vorticity and turbulence properties of the flow would be applicable. However, in this text, we instead want to focus on DL-related topics and target another inverse problem with differentiable physics solvers in the next chapter." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dl3vzF_XdIxv" + }, + "source": [ + "## Next steps\n", + "\n", + "* Modify the training to further reduce the training error. With the _medium_ network you should be able to get the loss down to around 1.\n", + "\n", + "* Turn off the differentiable physics training (by setting `msteps=1`), and compare it with the DP version.\n", + "\n", + "* Likewise, train a network with a larger `msteps` setting, e.g., 8 or 16. Note that due to the recurrent nature of the training, you'll probably have to load a pre-trained state to stabilize the first iterations.\n", + "\n", + "* Use the external github code to generate new test data, and run your trained NN on these cases. You'll see that a reduced training error not always directly correlates with an improved test performance.\n", + "\n" ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } - ], - "source": [ - "index = 50 # time step index\n", - "vx_ref = dataset_test.dataPreloaded[ dataset_test.dataSims[b] ][ index ][1][0,...]\n", - "vx_src = steps_source[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", - "vx_hyb = steps_hybrid[index][1].values.vector[1].numpy('batch,y,x')[b,...]\n", - "\n", - "fig, axes = pylab.subplots(1, 4, figsize=(14, 5))\n", - "\n", - "axes[0].imshow( vx_ref , origin='lower', cmap='magma')\n", - "axes[0].set_title(f\" Reference \")\n", - "\n", - "axes[1].imshow( vx_src , origin='lower', cmap='magma')\n", - "axes[1].set_title(f\" Source \")\n", - "\n", - "axes[2].imshow( vx_hyb , origin='lower', cmap='magma')\n", - "axes[2].set_title(f\" Learned \")\n", - "\n", - "# show error side by side\n", - "err_source = vx_ref - vx_src \n", - "err_hybrid = vx_ref - vx_hyb \n", - "v = np.concatenate([err_source,err_hybrid], axis=1)\n", - "axes[3].imshow( v , origin='lower', cmap='cividis')\n", - "axes[3].set_title(f\" Errors: Source & Learned\")\n", - "\n", - "pylab.tight_layout()\n" - ] + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "diffphys-code-sol-jun8.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" + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "BZByQsAydIxv" - }, - "source": [ - "This shows very clearly how the pure source simulation in the middle deviates from the reference on the left. The learned version stays much closer to the reference solution. \n", - "\n", - "The two per-cell error images on the right also illustrate this: the source version has much larger errors (i.e. brighter colors) that show how it systematically underestimates the vortices that should form. The error for the learned version is much more evenly distributed and significantly smaller in magnitude.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "UQTY8m6LdIxv" - }, - "source": [ - "This concludes our evaluation. Note that the improved behavior of the hybrid solver can be difficult to reliably measure with simple vector norms such as an MAE or $L^2$ norm. To improve this, we'd need to employ other, domain-specific metrics. In this case, metrics for fluids based on vorticity and turbulence properties of the flow would be applicable. However, in this text, we instead want to focus on DL-related topics and target another inverse problem with differentiable physics solvers in the next chapter." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Dl3vzF_XdIxv" - }, - "source": [ - "## Next steps\n", - "\n", - "* Modify the training to further reduce the training error. With the _medium_ network you should be able to get the loss down to around 1.\n", - "\n", - "* Turn off the differentiable physics training (by setting `msteps=1`), and compare it with the DP version.\n", - "\n", - "* Likewise, train a network with a larger `msteps` setting, e.g., 8 or 16. Note that due to the recurrent nature of the training, you'll probably have to load a pre-trained state to stabilize the first iterations.\n", - "\n", - "* Use the external github code to generate new test data, and run your trained NN on these cases. You'll see that a reduced training error not always directly correlates with an improved test performance.\n", - "\n" - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "name": "diffphys-code-sol.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": 0 -} + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file