{ "cells": [ { "cell_type": "markdown", "id": "10b7ec0c-8058-4050-bec9-63c70dfd1714", "metadata": {}, "source": [ "# Evaluate dynamics" ] }, { "cell_type": "markdown", "id": "1fe9756a-1702-482c-bb97-87bbdb906ce6", "metadata": {}, "source": [ "In this notebook we show how to use the `NoPEC` package to evaluate the dynamics of the state variables $y$ and $q$." ] }, { "cell_type": "code", "execution_count": 1, "id": "fdb7d700-e951-4af1-b533-447192b17723", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "from nopec.models import FenicsModel\n", "from nopec.parameters import Input, ModelParameters\n", "from nopec.tools import initializer" ] }, { "cell_type": "markdown", "id": "a2b33874-d941-42a4-b5ce-06713b276a59", "metadata": {}, "source": [ "## Define parameters\n", "First, we create a `ModelParameters` class containing all the information about the model and its discretization." ] }, { "cell_type": "code", "execution_count": 2, "id": "3c7260b3-8a6c-4574-9f94-0bbb98a780a8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'x_0': 0.0,\n", " 'x_L': 1.0,\n", " 'kappa_1': (x)>,\n", " 'kappa_2': (x)>,\n", " 'y_0': (x)>,\n", " 'T': 2.0,\n", " 'discretization_model': 'fenics',\n", " 'FE_degree': 1,\n", " 'N_nodes_x': 200,\n", " 'time_disc_met': 'IE',\n", " 'K': 201,\n", " 'damped_Newton': True,\n", " 'nonlinear_conv_tol': 1e-07}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pars = ModelParameters(\n", " \n", " # mathematical model\n", " x_0=0.0, # left point of domain\n", " x_L=1.0, # right point of domain\n", " kappa_1=lambda x: np.ones_like(x[0]), # diffusion function for y\n", " kappa_2=lambda x: np.ones_like(x[0]), # diffusion function for q\n", " y_0=lambda x: 5 * np.ones_like(x[0]), # initial value y(t=0)\n", " T=2.0, # final time\n", " \n", " # discretization parameters\n", " discretization_model=\"fenics\", # defines the discretization model\n", " FE_degree=1, # degree of finite element\n", " N_nodes_x=200, # number of discretization nodes\n", " time_disc_met=\"IE\", # time discretization method (in this case Implicit Euler)\n", " K=201, # number of time steps\n", ")\n", "pars.model_dump()" ] }, { "cell_type": "markdown", "id": "7e1cd170-ac07-4725-bb2d-792cf0ef65fc", "metadata": {}, "source": [ "## Define the input function\n", "Models need the input function $u$. We can use the [`Input`](https://andrea-petrocchi.codeberg.page/NoPEC/modules/parameters/input.html#input-parameter) to create an input array from a known function. Once chosen the one of the functions in `Input`, we need to evaluate it on each time step, namely $u(t_k)$." ] }, { "cell_type": "code", "execution_count": 3, "id": "de69479c-5dd2-4d0a-ab50-1ae478f2a91a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3.])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input_array = Input.JUMP_3_AT_166(pars.tv)\n", "input_array" ] }, { "cell_type": "markdown", "id": "215f1d69-36cb-4316-b8aa-924206d57997", "metadata": {}, "source": [ "One could as well define `input_array` directly as an array." ] }, { "cell_type": "code", "execution_count": 4, "id": "6e84b3d4-28bd-4350-b449-40f6b6a932b4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3.])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(pars.tv <= 4 / 3, -3.0, +3.0)" ] }, { "cell_type": "markdown", "id": "933e3ab3-0f1e-4fae-9a95-c38467b25511", "metadata": {}, "source": [ "## Model objects\n", "Models can be initialized with a `ModelParameters` instance and an `input_array` array." ] }, { "cell_type": "code", "execution_count": 5, "id": "2ac04547-b3fc-4a65-aad2-e672962d79bf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FenicsModel(input_array=array([-3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3.]), pars=ModelParameters(x_0=0.0, x_L=1.0, kappa_1= at 0x704cf5cb71a0>, kappa_2= at 0x704cf5cb7240>, y_0= at 0x704cf5cb7060>, T=2.0, discretization_model='fenics', FE_degree=1, N_nodes_x=200, time_disc_met='IE', K=201, damped_Newton=True, nonlinear_conv_tol=1e-07))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = FenicsModel(\n", " pars=pars,\n", " input_array=input_array,\n", ")\n", "model" ] }, { "cell_type": "markdown", "id": "ab63ed3c-0b25-4825-956f-1eec69c90080", "metadata": {}, "source": [ "As the information of what discretization method is used is already present in [`ModelParameters.discretization_method`](https://andrea-petrocchi.codeberg.page/NoPEC/modules/parameters/model.html#nopec.parameters.ModelParameters.discretization_model), we can use the `nopec.setup.initializer` function to create the model corresponding to the requested discretization method." ] }, { "cell_type": "code", "execution_count": 6, "id": "2488d50d-125a-4ed6-81d2-ed01360882a2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FenicsModel(input_array=array([-3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3., -3.,\n", " -3., -3., -3., -3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3.]), pars=ModelParameters(x_0=0.0, x_L=1.0, kappa_1= at 0x704cf5cb71a0>, kappa_2= at 0x704cf5cb7240>, y_0= at 0x704cf5cb7060>, T=2.0, discretization_model='fenics', FE_degree=1, N_nodes_x=200, time_disc_met='IE', K=201, damped_Newton=True, nonlinear_conv_tol=1e-07))" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "initializer(pars, input_array)" ] }, { "cell_type": "code", "execution_count": 7, "id": "de7d3d27-712f-4e66-a514-7e875136e2d2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(201,)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input_array.shape" ] }, { "cell_type": "code", "execution_count": 8, "id": "c8b2cdf9-db80-407f-8755-57e5a64d3f7a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 10.1 s, sys: 58.8 ms, total: 10.2 s\n", "Wall time: 2.43 s\n" ] } ], "source": [ "%%time\n", "Y_h, Q_h = model.state([3, 3, 3, 3])" ] }, { "cell_type": "code", "execution_count": 9, "id": "3661846d-5519-473b-858e-bfee680cfcac", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 0. , 0. , ..., 0. ,\n", " 0. , 0. ],\n", " [ 0.00209827, 0.00209534, 0.00209253, ..., -0.00195011,\n", " -0.00195218, -0.00195425],\n", " [ 0.00419666, 0.0041908 , 0.00418518, ..., -0.00390034,\n", " -0.00390448, -0.00390863],\n", " ...,\n", " [ 0.58739399, 0.58689571, 0.58643214, ..., -0.56603256,\n", " -0.56633984, -0.56664779],\n", " [ 0.59234108, 0.59184271, 0.59137905, ..., -0.57097638,\n", " -0.5712837 , -0.57159171],\n", " [ 0.59732337, 0.59682497, 0.59636129, ..., -0.57595757,\n", " -0.57626491, -0.57657294]], shape=(201, 200))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Q_h" ] }, { "cell_type": "code", "execution_count": 10, "id": "c4cd90db-0074-4c11-bcee-7d0729865448", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPURJREFUeJzt3QlcVlX+x/EvO4qCC4o74oaouQC5ZqtR2marZZmZVk6rOdZoNpVO/7HVlpk0nUyztGxsndEs21yyTHHJfVdQQQQVEGR//q97TMYFDRC4z/J5v15PcS73gcMBeb7ce87veDkcDocAAABs4m3XJwYAALAQRgAAgK0IIwAAwFaEEQAAYCvCCAAAsBVhBAAA2IowAgAAbEUYAQAAtvKVCygqKtL+/ftVs2ZNeXl52d0dAABQClZd1czMTDVq1Eje3t6uHUasINK0aVO7uwEAAMohMTFRTZo0ce0wYl0ROfHFBAcH290dAABQChkZGeZiwonXcZcOIyduzVhBhDACAIBr+aMpFkxgBQAAtiKMAAAAWxFGAACArQgjAADAVoQRAABgK8IIAACwFWEEAADYijACAABcL4xMmjRJERERCgwMVExMjJYsWXLO83NzczV27FiFh4crICBALVu21LvvvlvePgMAADdS5gqsc+bM0YgRI0wg6dWrl6ZMmaK+fftq48aNatasWYnPue2223TgwAFNmzZNrVq1UkpKigoKCiqi/wAAwMV5Oawt9cqgW7duio6O1uTJk4uPRUVFqX///powYcIZ5y9YsEC33367du7cqTp16pS7tn1ISIjS09MpBw8AgIso7et3mW7T5OXlKT4+XnFxcacct9rLli0r8TlffvmlYmNj9dJLL6lx48Zq06aNRo0apWPHjp3zto71BZz8AAAA7qlMYSQ1NVWFhYUKCws75bjVTk5OLvE51hWRpUuXav369frss8/0+uuva+7cuXrooYfO+nmsKyxWkjrxsHb8AwAAFW/ptlTdP3OlMnPy5VITWE/ffc+603O2HfmKiorM+2bNmqWuXbuqX79+mjhxombMmHHWqyNjxowxl3ROPBITE8vTTQAAcA570rL00OxV+mbjAb29aIdcYgJraGiofHx8zrgKYk1IPf1qyQkNGzY0t2esKxwnzzGxAszevXvVunXrM55jrbixHgAAoHIczS3QfTNXKv1Yvjo1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EKWlpVVZf13R4sWLdd1115kqqFYV888///wPn1Plr4UON/bRRx85/Pz8HP/6178cGzdudDz22GOOoKAgx549e0o8f+fOnY7q1aub86zzredZz587d26V992dx9l6/4svvuj49ddfHVu3bnWMGTPGPH/VqlVV3nd3H+sTjhw54mjRooUjLi7O0alTpyrrryeN8/XXX+/o1q2bY+HChY5du3Y5li9f7vjpp5+qtN/uPs5LlixxeHt7O9544w3z+9pqt2/f3tG/f/8q77srmT9/vmPs2LGOTz75xFo96/jss8/Oeb4dr4VuHUa6du3qGD58+CnH2rZt6xg9enSJ5z/55JPm/Sd74IEHHN27d6/UfnraOJekXbt2jnHjxlVC79xLecd6wIABjqefftrx7LPPEkYqYZy/+uorR0hIiCMtLa00Hx7lHOeXX37ZhOqTvfnmm44mTZowpqVUmjBix2uh296mycvLU3x8vOLi4k45brWXLVtW4nN+/vnnM86/6qqrtHLlSuXn51dqfz1pnEvaCNHaSKlOnTqV1EvPHuvp06drx44dpqgRKmecv/zyS8XGxuqll15S48aN1aZNG40aNUrHjh1jyCtwnHv27Km9e/dq/vz5ZgO2AwcOaO7cubrmmmsY5wpkx2uhS2yUVx6pqakqLCxUWFjYKcetdnJyconPsY6XdH5BQYH5eNb9SZz/OJ/u1VdfVVZWlm677TaGt4J/prdt26bRo0eb+/DWfBFUzjjv3LlTS5cuNffXP/vsM/MxHnzwQR06dIh5IxU4zlYYseaMDBgwQDk5OeZ38/XXX69//OMf/GhXIDteC932ysgJ1mSdk1lp+vRjf3R+ScdxfuN8wocffqjnnntOc+bMUf369RnWChxr6xf9wIEDNW7cOPOXOirvZ9q6ume9z3qh7Nq1q/r166eJEydqxowZXB2pwHHeuHGjHn30UT3zzDPmqsqCBQu0a9cuDR8+vGzfXPyhqn4tdNs/lUJDQ+Xj43NGwk5JSTkj8Z3QoEGDEs+3/qKsW7dupfbXk8b5BCuADB06VP/+97/Vp0+fSu6p5421devLuqy6evVqPfzww8UvmtYvFetn+ptvvtHll19eZf13559p6y9F6/bMyVulR0VFmbG2biu0bt260vvtCeM8YcIE9erVS0888YRpd+zYUUFBQerdu7eef/55rl5XEDteC932yoi/v79ZlrRw4cJTjltt61JfSawlpqefb/3Ctu4F+/n5VWp/PWmcT1wRueeeezR79mzu91bSWFvLptetW6c1a9YUP6y/ICMjI83b3bp1K+2n9ijl+Zm2XiD379+vo0ePFh/bunWrvL291aRJk0rvs6eMc3Z2thnTk1mBxsI2axXHltdChwcsG5s2bZpZnjRixAizbGz37t3m/daM7UGDBp2xnOnxxx8351vPY2lvxY/z7NmzHb6+vo633nrLkZSUVPywlp+iYsf6dKymqZxxzszMNCs6brnlFseGDRscixYtcrRu3doxbNgwfqQrcJynT59ufndMmjTJsWPHDsfSpUsdsbGxZlUOzs76+Vy9erV5WC/7EydONG+fWELtDK+Fbh1GLNYLXnh4uMPf398RHR1tfkmcMHjwYMcll1xyyvk//vijo0uXLub85s2bOyZPnmxDr917nK23rX8Qpz+s81CxY306wkjl/ExbNm3a5OjTp4+jWrVqJpiMHDnSkZ2dzY90BY+ztZTXKgVgjXPDhg0dd955p2Pv3r2M8zn88MMP5/yd6wyvhV7WfyrnmgsAAIAHzxkBAACugTACAABsRRgBAAC2IowAAABbEUYAAICtCCMAAMBWhBEAAGArwggAALAVYQQAANiKMAIAAGxFGAEAALYijAAAANnp/wGOfs/HPa9dNQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.plot(model.FE.Omega.geometry.x[:, 0], Q_h[:, 0])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" } }, "nbformat": 4, "nbformat_minor": 5 }