From 7fe035375b9df91990c09dd8634c5610e78a04e9 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta <32356220+iitrabhi@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:13:42 -0600 Subject: [PATCH 1/3] Update README.md --- README.md | 52 ---------------------------------------------------- 1 file changed, 52 deletions(-) diff --git a/README.md b/README.md index 538fd44..38f5d69 100644 --- a/README.md +++ b/README.md @@ -6,64 +6,12 @@ The course materials, including tutorials and exercises, were created as part of The `tutorials` are comprehensive notebooks that demonstrate how to approach different types of problems using FEniCS. On the other hand, the `exercises` are meant to be interactive, and they encourage you to expand the notebooks by adding new functionalities. This way, you can develop your expertise in using FEniCS. -If you just want to view the tutorials and exercises without making any changes, you can access them on [on nbviewer](https://nbviewer.org/github/iitrabhi/iitm-fenics-course/blob/48a6a14f8f7c27f2a32cf1ea101e18934d254b01/README.ipynb) without installing FEniCS. However, if you want to edit and undertake the exercises, you will need to [install FEniCS](install-instructions.ipynb). Additionally, you have the option to either clone the repository or download the code from the provided link. - ## What is FEniCS FEniCS is an acronym that stands for "Finite Element Computational Software." The inclusion of "ni" in the name is to create a balanced and appealing composition. The FEniCS software package was compiled at the University of Chicago, whose Phoenix mascot likely influenced the choice of the name. FEniCS is a high-performance computing (HPC) capable tool that efficiently utilizes supercomputers and high-performance clusters to solve complex scientific problems. It supports parallel computing, JIT compilation, and integrates with PETSc and MPI for scalability and performance. Its HPC capabilities enable researchers to perform large-scale simulations and analyses effectively. -## Contents -- [Instructions for installing FEniCS](install-instructions.ipynb) -- Day 1 - - Tutorials - - [Tutorial 1-1: Solving linear Poisson's equation](src/day-1/tutorials/1_linear_poisson.ipynb) - - [Tutorial 1-2: Visualization](src/day-1/tutorials/2_visualization.ipynb) - - Exercises - - [Exercise 1-1: Built in meshes](src/day-1/exercises/1_built_in_mesh.ipynb) - - [Exercise 1-2: Boundary conditions](src/day-1/exercises/2_boundary_conditions.ipynb) - - [Exercise 1-3: Expressions](src/day-1/exercises/3_expressions.ipynb) - - [Exercise 1-4: Spacially varying properties](src/day-1/exercises/4_spacially_varying_properties.ipynb) - - [Exercise 1-5: Convergence](src/day-1/exercises/5_convergence.ipynb) -- Day 2 - - Tutorials - - [Tutorial 2-1: Solving non-linear Poisson's equation using Picard Iteration](src/day-2/tutorials/1_non_linear_poisson_picard.ipynb) - - [Tutorial 2-3: Solving non-linear Poisson's equation using Newton Iteration](src/day-2/tutorials/2_non_linear_poisson_newton.ipynb) - - [Tutorial 2-3: Newton method with Manual Differentiation](src/day-2/tutorials/3_non_linear_poisson_newton_manual_diff.ipynb) - - [Tutorial 2-4: Newton method with Automatic Differentiation](src/day-2/tutorials/4_non_linear_poisson_newton_auto_diff.ipynb) - - Exercises - - [Exercise 2-1: 2D and 3D Domains](src/day-2/exercises/1_2d_3d_domains.ipynb) - - [Exercise 2-2: Boundary Conditions](src/day-2/exercises/2_boundary_conditions.ipynb) - - [Exercise 2-3: Non-Linearity and Tolerances](src/day-2/exercises/3_non_linearity_tolerances.ipynb) - - [Exercise 2-4: Manual vs Auto differentiation](src/day-2/exercises/4_manual_auto_differentiation.ipynb) -- Day 3 - - Tutorials - - [Tutorial 3-1: Beam bending](src/day-3/tutorials/1_beam_bending.ipynb) - - [Tutorial 3-2: Loads and boundary conditions](src/day-3/tutorials/2_load_and_boundary_conditions.ipynb) - - [Tutorial 3-3: Solver design](src/day-3/tutorials/3_solver.ipynb) - - Exercises - - [Exercise 3-1: 3D Uniaxial](src/day-3/exercises/1_3d_uniaxial.ipynb) - - [Exercise 3-2: Plane Stress v/s Plane strain](src/day-3/exercises/2_plane_stress_strain.ipynb) - - [Exercise 3-3: Effect of solver design](src/day-3/exercises/3_solver_design.ipynb) -- Day 4 - - Tutorials - - [Tutorial 4-1: Solving hyper elasticity in FEniCS](src/day-4/tutorials/1_hyper_elastic.ipynb) - - [Tutorial 4-1: Pseudo time stepping in hyper elasticity](src/day-4/tutorials/2_load_displacement.ipynb) - - Exercises - - [Exercise 4-1: Mooney rivlin material model](src/day-4/exercises/1_mooney-rivlin.ipynb) - - [Exercise 4-2: Comparison between elastic and hyperelastic solution](src/day-4/exercises/2_comparison.ipynb) -- Day 5 - - Tutorials - - [Tutorial 5-1:Thermoelasticity](src/day-5/tutorials/1_thermoelasticity.ipynb) - - [Tutorial 5-2:Multi-material domains](src/day-5/tutorials/2_multi_material.ipynb) - - [Tutorial 5-3:Transient analysis](src/day-5/tutorials/3_transient_analysis.ipynb) - - Exercise - - [Exercise 5-1:Bi-metallic quasi static analysis](src/day-5/exercises/1_bi_metallic_quasi_static.ipynb) - - [Exercise 5-2:Transient thermo-mechanical analysis](src/day-5/exercises/2_thermo_mechanical_transient.ipynb) - - - ## Where to find help When in doubt about any specific FEniCS command or implementation, there are several resources you can refer to for clarification and assistance: From 68ddf5dfd50834d597083dde7651500d0a99a1a5 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta Date: Sun, 5 Jan 2025 17:20:19 -0600 Subject: [PATCH 2/3] Create folder jupyter notebooks --- .../day-1/exercises/1_built_in_mesh.ipynb | 100 + .../exercises/2_boundary_conditions.ipynb | 126 ++ .../day-1/exercises/3_expressions.ipynb | 127 ++ .../4_spacially_varying_properties.ipynb | 133 ++ .../day-1/exercises/5_convergence.ipynb | 106 + .../day-1/tutorials/1_linear_poisson.ipynb | 1815 +++++++++++++++++ .../day-1/tutorials/2_visualization.ipynb | 160 ++ .../day-2/exercises/1_2d_3d_domains.ipynb | 168 ++ .../exercises/2_boundary_conditions.ipynb | 141 ++ .../3_non_linearity_tolerances.ipynb | 155 ++ .../4_manual_auto_differentiation.ipynb | 134 ++ .../1_non_linear_poisson_picard.ipynb | 252 +++ .../2_non_linear_poisson_newton.ipynb | 330 +++ ...on_linear_poisson_newton_manual_diff.ipynb | 228 +++ ..._non_linear_poisson_newton_auto_diff.ipynb | 218 ++ .../day-3/exercises/1_3d_uniaxial.ipynb | 234 +++ .../exercises/2_plane_stress_strain.ipynb | 123 ++ .../day-3/exercises/3_solver_design.ipynb | 157 ++ .../day-3/tutorials/1_beam_bending.ipynb | 440 ++++ .../2_load_and_boundary_conditions.ipynb | 495 +++++ .../day-3/tutorials/3_solver.ipynb | 168 ++ .../day-4/exercises/1_mooney-rivlin.ipynb | 203 ++ .../day-4/exercises/2_comparison.ipynb | 365 ++++ .../day-4/tutorials/1_hyper_elastic.ipynb | 212 ++ .../day-4/tutorials/2_load_displacement.ipynb | 222 ++ .../1_bi_metallic_quasi_static.ipynb | 105 + .../2_thermo_mechanical_transient.ipynb | 62 + .../day-5/tutorials/1_thermoelasticity.ipynb | 234 +++ .../day-5/tutorials/2_multi_material.ipynb | 275 +++ .../tutorials/3_transient_analysis.ipynb | 195 ++ mkdocs/.DS_Store | Bin 6151 -> 6148 bytes 31 files changed, 7683 insertions(+) create mode 100644 jupyter_notebooks/day-1/exercises/1_built_in_mesh.ipynb create mode 100644 jupyter_notebooks/day-1/exercises/2_boundary_conditions.ipynb create mode 100644 jupyter_notebooks/day-1/exercises/3_expressions.ipynb create mode 100644 jupyter_notebooks/day-1/exercises/4_spacially_varying_properties.ipynb create mode 100644 jupyter_notebooks/day-1/exercises/5_convergence.ipynb create mode 100644 jupyter_notebooks/day-1/tutorials/1_linear_poisson.ipynb create mode 100644 jupyter_notebooks/day-1/tutorials/2_visualization.ipynb create mode 100644 jupyter_notebooks/day-2/exercises/1_2d_3d_domains.ipynb create mode 100644 jupyter_notebooks/day-2/exercises/2_boundary_conditions.ipynb create mode 100644 jupyter_notebooks/day-2/exercises/3_non_linearity_tolerances.ipynb create mode 100644 jupyter_notebooks/day-2/exercises/4_manual_auto_differentiation.ipynb create mode 100644 jupyter_notebooks/day-2/tutorials/1_non_linear_poisson_picard.ipynb create mode 100644 jupyter_notebooks/day-2/tutorials/2_non_linear_poisson_newton.ipynb create mode 100644 jupyter_notebooks/day-2/tutorials/3_non_linear_poisson_newton_manual_diff.ipynb create mode 100644 jupyter_notebooks/day-2/tutorials/4_non_linear_poisson_newton_auto_diff.ipynb create mode 100644 jupyter_notebooks/day-3/exercises/1_3d_uniaxial.ipynb create mode 100644 jupyter_notebooks/day-3/exercises/2_plane_stress_strain.ipynb create mode 100644 jupyter_notebooks/day-3/exercises/3_solver_design.ipynb create mode 100644 jupyter_notebooks/day-3/tutorials/1_beam_bending.ipynb create mode 100644 jupyter_notebooks/day-3/tutorials/2_load_and_boundary_conditions.ipynb create mode 100644 jupyter_notebooks/day-3/tutorials/3_solver.ipynb create mode 100644 jupyter_notebooks/day-4/exercises/1_mooney-rivlin.ipynb create mode 100644 jupyter_notebooks/day-4/exercises/2_comparison.ipynb create mode 100644 jupyter_notebooks/day-4/tutorials/1_hyper_elastic.ipynb create mode 100644 jupyter_notebooks/day-4/tutorials/2_load_displacement.ipynb create mode 100644 jupyter_notebooks/day-5/exercises/1_bi_metallic_quasi_static.ipynb create mode 100644 jupyter_notebooks/day-5/exercises/2_thermo_mechanical_transient.ipynb create mode 100644 jupyter_notebooks/day-5/tutorials/1_thermoelasticity.ipynb create mode 100644 jupyter_notebooks/day-5/tutorials/2_multi_material.ipynb create mode 100644 jupyter_notebooks/day-5/tutorials/3_transient_analysis.ipynb diff --git a/jupyter_notebooks/day-1/exercises/1_built_in_mesh.ipynb b/jupyter_notebooks/day-1/exercises/1_built_in_mesh.ipynb new file mode 100644 index 0000000..85686a8 --- /dev/null +++ b/jupyter_notebooks/day-1/exercises/1_built_in_mesh.ipynb @@ -0,0 +1,100 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Built in meshes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "FEniCS provides built-in capabilities to generate various types of meshes, allowing users to focus on the core of their simulations. Please visit the official documentation link provided to learn how to modify the mesh. After familiarizing yourself with the process, return here to implement the changes and visualize the updated results.\n", + "\n", + "https://fenicsproject.org/olddocs/dolfin/latest/python/demos/built-in-meshes/demo_built-in-meshes.py.html" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Make a 2D unit square mesh.\n", + "2. Make a rectangle mesh with dimension $2 \\times 1$" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = IntervalMesh(30, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "U = FunctionSpace(mesh, \"CG\", 1)\n", + "\n", + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)\n", + "u, v = TrialFunction(U), TestFunction(U)\n", + "\n", + "a = inner(grad(u), grad(v)) * dx\n", + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)\n", + "L = f_expr * v * dx\n", + "\n", + "u_sol = Function(U, name = \"field\")\n", + "solve(a == L, u_sol, bc)\n", + "\n", + "with XDMFFile(\"output/result.xdmf\") as outfile:\n", + " outfile.write(u_sol)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-1/exercises/2_boundary_conditions.ipynb b/jupyter_notebooks/day-1/exercises/2_boundary_conditions.ipynb new file mode 100644 index 0000000..2e9ffb1 --- /dev/null +++ b/jupyter_notebooks/day-1/exercises/2_boundary_conditions.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Boundary conditions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In FEniCS, the \"CompiledSubDomain\" class is a useful tool that allows users to define complex subdomains within a given computational domain for finite element simulations. Subdomains are portions of the computational domain where different physical or material properties are applied, or specific boundary conditions are imposed.\n", + "\n", + "The primary advantage of using the \"CompiledSubDomain\" class is that it allows you to define subdomains using mathematical expressions or conditions, which are then compiled into efficient C++ code. This compiled code is utilized during the simulation, providing a significant performance boost compared to interpreting the subdomain expressions directly in Python.\n", + "\n", + "Please visit the official documentation link provided to learn how to modify the bounday conditions using \"CompiledSubDomain\". After familiarizing yourself with the process, return here to implement the changes and visualize the updated results.\n", + "\n", + "https://hplgit.github.io/fenics-tutorial/pub/sphinx1/._ftut1005.html#using-c-code-snippets-to-define-subdomains" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Make a 2D unit square mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = IntervalMesh(30, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "U = FunctionSpace(mesh, \"CG\", 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Mark only the left edge as fixed.\n", + "2. Mark the left and top edge as fixed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "u, v = TrialFunction(U), TestFunction(U)\n", + "\n", + "a = inner(grad(u), grad(v)) * dx\n", + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)\n", + "L = f_expr * v * dx\n", + "\n", + "u_sol = Function(U, name = \"field\")\n", + "solve(a == L, u_sol, bc)\n", + "\n", + "with XDMFFile(\"output/result.xdmf\") as outfile:\n", + " outfile.write(u_sol)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/jupyter_notebooks/day-1/exercises/3_expressions.ipynb b/jupyter_notebooks/day-1/exercises/3_expressions.ipynb new file mode 100644 index 0000000..d2bf4da --- /dev/null +++ b/jupyter_notebooks/day-1/exercises/3_expressions.ipynb @@ -0,0 +1,127 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Expressions\n", + "\n", + "In FEniCS, an Expression is a flexible and convenient way to define mathematical functions or expressions within the domain of interest. Expressions are often used to specify boundary conditions, source terms, initial conditions, or any other function needed in the formulation of the PDE problem.\n", + "\n", + "The beauty of using Expressions lies in their simplicity and directness. Users can define an Expression using a concise mathematical expression, incorporating spatial coordinates and/or time variables. Additionally, FEniCS supports the use of elementary mathematical functions, mathematical constants, and custom-defined functions within Expressions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please visit the official documentation link provided to learn how to modify expressions. After familiarizing yourself with the process, return here to implement the changes and visualize the updated results.\n", + "\n", + "https://hplgit.github.io/fenics-tutorial/pub/sphinx1/._ftut1003.html#index-28" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Make a 2D unit square mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = IntervalMesh(30, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "U = FunctionSpace(mesh, \"CG\", 1)\n", + "\n", + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)\n", + "u, v = TrialFunction(U), TestFunction(U)\n", + "\n", + "a = inner(grad(u), grad(v)) * dx\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Change the forcing function to $f(x) = x$\n", + "2. Change the forcing function to $f(x,y) = sin(\\pi x)sin(\\pi y)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "L = f_expr * v * dx\n", + "\n", + "u_sol = Function(U, name = \"field\")\n", + "solve(a == L, u_sol, bc)\n", + "\n", + "with XDMFFile(\"output/result.xdmf\") as outfile:\n", + " outfile.write(u_sol)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/jupyter_notebooks/day-1/exercises/4_spacially_varying_properties.ipynb b/jupyter_notebooks/day-1/exercises/4_spacially_varying_properties.ipynb new file mode 100644 index 0000000..91a94f6 --- /dev/null +++ b/jupyter_notebooks/day-1/exercises/4_spacially_varying_properties.ipynb @@ -0,0 +1,133 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Spacially varying properties\n", + "\n", + "With FEniCS, researchers and engineers can model and simulate problems with spatially varying material properties efficiently and accurately. We can use the Expression class provided by FEniCS to represent the material property as a function of the co-ordinate of the mesh." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please visit the official documentation link provided to learn how to modify expressions. After familiarizing yourself with the process, return here to implement the changes and visualize the updated results.\n", + "\n", + "https://hplgit.github.io/fenics-tutorial/pub/sphinx1/._ftut1003.html#index-28" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Make a 2D unit square mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = IntervalMesh(30, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "U = FunctionSpace(mesh, \"CG\", 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to:**\n", + "1. Change the material property to $E(x) = 10 + x$" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "E = Constant(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calling FFC just-in-time (JIT) compiler, this may take some time.\n" + ] + } + ], + "source": [ + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)\n", + "u, v = TrialFunction(U), TestFunction(U)\n", + "\n", + "a = E * inner(grad(u), grad(v)) * dx\n", + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)\n", + "L = f_expr * v * dx\n", + "\n", + "u_sol = Function(U, name = \"field\")\n", + "solve(a == L, u_sol, bc)\n", + "\n", + "with XDMFFile(\"output/result.xdmf\") as outfile:\n", + " outfile.write(u_sol)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-1/exercises/5_convergence.ipynb b/jupyter_notebooks/day-1/exercises/5_convergence.ipynb new file mode 100644 index 0000000..21c38a3 --- /dev/null +++ b/jupyter_notebooks/day-1/exercises/5_convergence.ipynb @@ -0,0 +1,106 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Convergence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Convergence analysis in the FEM is a critical process that evaluates the accuracy and reliability of numerical solutions to PDEs. It involves discretizing the continuous problem into a mesh of elements and studying how the numerical solution converges to the exact solution as the mesh is refined. \n", + "\n", + "By analyzing various error norms and convergence rates, researchers can determine the reliability of the numerical scheme, select appropriate mesh resolutions, and validate results against analytical solutions. \n", + "\n", + "Please visit the official documentation link provided to learn how to modify the mesh. After familiarizing yourself with the process, return here to implement the changes and visualize the updated results.\n", + "\n", + "https://fenicsproject.org/olddocs/dolfin/latest/python/demos/built-in-meshes/demo_built-in-meshes.py.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Change this portion of the code to make a 2D unit square mesh and perform the analysis with mesh size:**\n", + "1. $2\\times 2$\n", + "2. $5\\times 5$\n", + "3. $10\\times 10$\n", + "4. $20\\times 20$\n", + "5. $50\\times 50$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = IntervalMesh(30, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "U = FunctionSpace(mesh, \"CG\", 1)\n", + "\n", + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)\n", + "u, v = TrialFunction(U), TestFunction(U)\n", + "\n", + "a = inner(grad(u), grad(v)) * dx\n", + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)\n", + "L = f_expr * v * dx\n", + "\n", + "u_sol = Function(U, name = \"field\")\n", + "solve(a == L, u_sol, bc)\n", + "\n", + "with XDMFFile(\"output/result.xdmf\") as outfile:\n", + " outfile.write(u_sol)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/jupyter_notebooks/day-1/tutorials/1_linear_poisson.ipynb b/jupyter_notebooks/day-1/tutorials/1_linear_poisson.ipynb new file mode 100644 index 0000000..5d93e62 --- /dev/null +++ b/jupyter_notebooks/day-1/tutorials/1_linear_poisson.ipynb @@ -0,0 +1,1815 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Poissons Equation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome to this FEniCS tutorial, where we will explore how to verify the accuracy of a Poisson's equation solver using the \"manufactured solution\" technique. FEniCS is a powerful open-source finite element library for solving partial differential equations (PDEs), widely used for scientific computing and simulation.\n", + "\n", + "The \"manufactured solution\" approach is a valuable method to validate the correctness of finite element implementations. In this technique, we first construct an exact solution to the PDE, often a smooth and analytically known function, that satisfies the given equation. Next, we compute the corresponding right-hand side of the PDE using the exact solution. By feeding the manufactured solution and the derived right-hand side into our FEniCS solver, we can compare the numerical solution with the exact solution, thus quantifying the solver's accuracy.\n", + "\n", + "In this tutorial, we will focus on solving the one-dimensional Poisson's equation:\n", + "\n", + "$$\\begin{split}- \\nabla^{2} u &= f \\quad {\\rm in} \\ \\Omega, \\\\\n", + " u &= 0 \\quad {\\rm on} \\ \\Gamma_{D}, \\\\\n", + " \\nabla u \\cdot n &= g \\quad {\\rm on} \\ \\Gamma_{N}. \\\\\\end{split}\n", + "$$\n", + "\n", + "subject to homogeneous Dirichlet boundary conditions, where u(x) is the unknown function, and f(x) is the right-hand side. We will construct a simple manufactured solution, u_exact(x), and calculate the corresponding f(x) that satisfies the equation.\n", + "\n", + "Throughout the tutorial, we will cover the following steps:\n", + "\n", + "- Importing the necessary modules.\n", + "- Defining the manufactured solution and its corresponding right-hand side.\n", + "- Creating the one-dimensional mesh using FEniCS.\n", + "- Defining the appropriate FunctionSpace for the problem.\n", + "- Imposing the homogeneous Dirichlet boundary conditions.\n", + "- Formulating the variational problem using FEniCS's TrialFunction and TestFunction.\n", + "- Solving the Poisson's equation using FEniCS's solve function.\n", + "- Comparing the numerical solution with the exact solution to quantify the solver's accuracy.\n", + "\n", + "By the end of this tutorial, you will have a better understanding of the manufactured solution technique, its importance in validating finite element solvers, and how to implement it using FEniCS on an interval mesh. So, let's get started with our journey into the world - of FEniCS and manufactured solutions!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Import the necessary modules\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Define the mesh" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Create the mesh\n", + "num_elements = 3\n", + "# num_elements equally spaced intervals in [0, 1]\n", + "mesh = IntervalMesh(num_elements, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(mesh)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Define the function space\n", + "\n", + "The line of code `U = FunctionSpace(mesh, \"CG\", 1)` in FEniCS creates a function space `U` based on linear continuous elements (`CG`) defined on the mesh with degree `1` polynomial approximation. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "U = FunctionSpace(mesh, \"CG\", 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Define boundary condition" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create a `DirichletBC` object (`bc`) that associates the function space `U` with the boundary condition `u_D` and the subdomain `boundary`. This means that the solution function `u_sol` will have the value `0.0` on the boundary of the domain during the solution of the PDE\n", + "." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 5: Define weak form\n", + "\n", + "$$a(u, v) = L(v) \\quad \\forall \\ v \\in V,$$\n", + "$$\\begin{split}a(u, v) &= \\int_{\\Omega} \\nabla u \\cdot \\nabla v \\, {\\rm d} x, \\\\\n", + "L(v) &= \\int_{\\Omega} f v \\, {\\rm d} x.\\end{split}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "u = TrialFunction(U)\n", + "v = TestFunction(U)\n", + "a = inner(grad(u), grad(v)) * dx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 5.1: Define the manufactured rhs\n", + "\n", + "For this tutorial, let's choose a simple manufactured solution. We will solve the Poisson's equation in 1D:\n", + "\n", + "$$-\\Delta u(x) = f(x), 0 < x < 1,$$\n", + "\n", + "where u(x) is the unknown function, and f(x) is the right-hand side. We will choose an analytical solution u_exact(x) that satisfies the above equation.\n", + "\n", + "For this example, let's take:\n", + "\n", + "$$u_{exact}(x) = sin(\\pi x)$$\n", + "\n", + "and calculate the corresponding f(x):\n", + "\n", + "$$f(x) = -\\Delta u_{exact}(x) = \\pi^2 sin(\\pi x)$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize Expression \n", + "In the given code snippet:\n", + "\n", + "1. `V = FunctionSpace(mesh, 'CG', 1)`: We create a function space `V` defined on the provided mesh. The function space is based on continuous Galerkin (CG) elements and uses a polynomial degree of 1 for the basis functions. This means that functions in `V` will be represented as piecewise linear continuous functions over each element of the mesh.\n", + "\n", + "2. `f_val = project(f_expr, V)`: We use the `project` function to interpolate the expression `f_expr` onto the function space `V`. This creates a new function `f_val` that represents the projection of the expression `f_expr` onto the space `V`. The `project` function is useful when we want to create functions from `Expression` and visualize them.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "V = FunctionSpace(mesh, 'CG', 1)\n", + "f_val = project(f_expr, V)\n", + "plt.plot([f_val(x) for x in np.linspace(0,1,100)])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "L = f_expr * v * dx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute the solution\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "u_sol = Function(U)\n", + "solve(a == L, u_sol, bc)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u_sol)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can pass the co-ordinates of any point inside the mesh to get the value of any FEniCS function at that point" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.8648790643807451" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u_sol(0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Post processing" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def u_exact(x):\n", + " return np.sin(np.pi * x)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L2 error: 0.6951127497810745\n" + ] + } + ], + "source": [ + "points = np.linspace(0, 1, 100)\n", + "\n", + "# Evaluate the exact solution at the mesh points\n", + "u_exact_values = np.array([u_exact(x) for x in points])\n", + "\n", + "# Evaluate the numerical solution at the mesh points\n", + "u_numerical_values = np.array([u_sol(x) for x in points])\n", + "\n", + "# Compute the error\n", + "error = u_exact_values - u_numerical_values\n", + "\n", + "print(\"L2 error:\", np.linalg.norm(error))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.plot(points, u_exact_values, \"--\", label='Exact solution', linewidth=3)\n", + "plt.plot(points, u_numerical_values, label='Numerical solution')\n", + "plt.xlabel('x')\n", + "plt.ylabel('u(x)')\n", + "plt.legend()\n", + "plt.title('Manufactured solution of Poisson\\'s equation')\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "!pip install plotly" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "legendgroup": "Exact solution", + "line": { + "color": "black", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "Exact solution", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0, + 0.010101010101010102, + 0.020202020202020204, + 0.030303030303030304, + 0.04040404040404041, + 0.05050505050505051, + 0.06060606060606061, + 0.07070707070707072, + 0.08080808080808081, + 0.09090909090909091, + 0.10101010101010102, + 0.11111111111111112, + 0.12121212121212122, + 0.13131313131313133, + 0.14141414141414144, + 0.15151515151515152, + 0.16161616161616163, + 0.17171717171717174, + 0.18181818181818182, + 0.19191919191919193, + 0.20202020202020204, + 0.21212121212121213, + 0.22222222222222224, + 0.23232323232323235, + 0.24242424242424243, + 0.25252525252525254, + 0.26262626262626265, + 0.27272727272727276, + 0.2828282828282829, + 0.29292929292929293, + 0.30303030303030304, + 0.31313131313131315, + 0.32323232323232326, + 0.33333333333333337, + 0.3434343434343435, + 0.3535353535353536, + 0.36363636363636365, + 0.37373737373737376, + 0.38383838383838387, + 0.393939393939394, + 0.4040404040404041, + 0.4141414141414142, + 0.42424242424242425, + 0.43434343434343436, + 0.4444444444444445, + 0.4545454545454546, + 0.4646464646464647, + 0.4747474747474748, + 0.48484848484848486, + 0.494949494949495, + 0.5050505050505051, + 0.5151515151515152, + 0.5252525252525253, + 0.5353535353535354, + 0.5454545454545455, + 0.5555555555555556, + 0.5656565656565657, + 0.5757575757575758, + 0.5858585858585859, + 0.595959595959596, + 0.6060606060606061, + 0.6161616161616162, + 0.6262626262626263, + 0.6363636363636365, + 0.6464646464646465, + 0.6565656565656566, + 0.6666666666666667, + 0.6767676767676768, + 0.686868686868687, + 0.696969696969697, + 0.7070707070707072, + 0.7171717171717172, + 0.7272727272727273, + 0.7373737373737375, + 0.7474747474747475, + 0.7575757575757577, + 0.7676767676767677, + 0.7777777777777778, + 0.787878787878788, + 0.797979797979798, + 0.8080808080808082, + 0.8181818181818182, + 0.8282828282828284, + 0.8383838383838385, + 0.8484848484848485, + 0.8585858585858587, + 0.8686868686868687, + 0.8787878787878789, + 0.888888888888889, + 0.8989898989898991, + 0.9090909090909092, + 0.9191919191919192, + 0.9292929292929294, + 0.9393939393939394, + 0.9494949494949496, + 0.9595959595959597, + 0.9696969696969697, + 0.9797979797979799, + 0.98989898989899, + 1 + ], + "xaxis": "x", + "y": [ + 0, + 0.03172793349806765, + 0.0634239196565645, + 0.09505604330418266, + 0.12659245357374926, + 0.15800139597334992, + 0.1892512443604102, + 0.22031053278654067, + 0.2511479871810792, + 0.28173255684142967, + 0.3120334456984871, + 0.34202014332566877, + 0.3716624556603275, + 0.4009305354066137, + 0.4297949120891717, + 0.4582265217274104, + 0.4861967361004687, + 0.5136773915734064, + 0.5406408174555976, + 0.5670598638627707, + 0.5929079290546405, + 0.6181589862206052, + 0.6427876096865394, + 0.6667690005162916, + 0.6900790114821119, + 0.7126941713788629, + 0.7345917086575333, + 0.7557495743542583, + 0.7761464642917569, + 0.7957618405308321, + 0.8145759520503357, + 0.8325698546347714, + 0.8497254299495144, + 0.8660254037844387, + 0.8814533634475821, + 0.8959937742913359, + 0.9096319953545183, + 0.9223542941045815, + 0.9341478602651067, + 0.9450008187146685, + 0.954902241444074, + 0.963842158559942, + 0.9718115683235417, + 0.9788024462147787, + 0.9848077530122081, + 0.9898214418809327, + 0.9938384644612541, + 0.9968547759519424, + 0.998867339183008, + 0.9998741276738751, + 0.9998741276738751, + 0.998867339183008, + 0.9968547759519424, + 0.9938384644612541, + 0.9898214418809327, + 0.984807753012208, + 0.9788024462147786, + 0.9718115683235417, + 0.9638421585599422, + 0.9549022414440739, + 0.9450008187146685, + 0.9341478602651067, + 0.9223542941045814, + 0.9096319953545182, + 0.8959937742913359, + 0.8814533634475821, + 0.8660254037844385, + 0.8497254299495143, + 0.8325698546347712, + 0.8145759520503358, + 0.795761840530832, + 0.7761464642917568, + 0.7557495743542583, + 0.7345917086575331, + 0.7126941713788627, + 0.6900790114821119, + 0.6667690005162917, + 0.6427876096865395, + 0.6181589862206051, + 0.5929079290546404, + 0.5670598638627704, + 0.5406408174555974, + 0.5136773915734063, + 0.4861967361004687, + 0.4582265217274105, + 0.4297949120891714, + 0.4009305354066136, + 0.37166245566032713, + 0.3420201433256685, + 0.31203344569848696, + 0.28173255684142967, + 0.2511479871810793, + 0.22031053278654036, + 0.18925124436041008, + 0.15800139597334945, + 0.12659245357374938, + 0.09505604330418288, + 0.0634239196565644, + 0.031727933498067656, + 1.2246467991473532e-16 + ], + "yaxis": "y" + }, + { + "legendgroup": "Numerical solution", + "line": { + "color": "blue", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "Numerical solution", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0, + 0.010101010101010102, + 0.020202020202020204, + 0.030303030303030304, + 0.04040404040404041, + 0.05050505050505051, + 0.06060606060606061, + 0.07070707070707072, + 0.08080808080808081, + 0.09090909090909091, + 0.10101010101010102, + 0.11111111111111112, + 0.12121212121212122, + 0.13131313131313133, + 0.14141414141414144, + 0.15151515151515152, + 0.16161616161616163, + 0.17171717171717174, + 0.18181818181818182, + 0.19191919191919193, + 0.20202020202020204, + 0.21212121212121213, + 0.22222222222222224, + 0.23232323232323235, + 0.24242424242424243, + 0.25252525252525254, + 0.26262626262626265, + 0.27272727272727276, + 0.2828282828282829, + 0.29292929292929293, + 0.30303030303030304, + 0.31313131313131315, + 0.32323232323232326, + 0.33333333333333337, + 0.3434343434343435, + 0.3535353535353536, + 0.36363636363636365, + 0.37373737373737376, + 0.38383838383838387, + 0.393939393939394, + 0.4040404040404041, + 0.4141414141414142, + 0.42424242424242425, + 0.43434343434343436, + 0.4444444444444445, + 0.4545454545454546, + 0.4646464646464647, + 0.4747474747474748, + 0.48484848484848486, + 0.494949494949495, + 0.5050505050505051, + 0.5151515151515152, + 0.5252525252525253, + 0.5353535353535354, + 0.5454545454545455, + 0.5555555555555556, + 0.5656565656565657, + 0.5757575757575758, + 0.5858585858585859, + 0.595959595959596, + 0.6060606060606061, + 0.6161616161616162, + 0.6262626262626263, + 0.6363636363636365, + 0.6464646464646465, + 0.6565656565656566, + 0.6666666666666667, + 0.6767676767676768, + 0.686868686868687, + 0.696969696969697, + 0.7070707070707072, + 0.7171717171717172, + 0.7272727272727273, + 0.7373737373737375, + 0.7474747474747475, + 0.7575757575757577, + 0.7676767676767677, + 0.7777777777777778, + 0.787878787878788, + 0.797979797979798, + 0.8080808080808082, + 0.8181818181818182, + 0.8282828282828284, + 0.8383838383838385, + 0.8484848484848485, + 0.8585858585858587, + 0.8686868686868687, + 0.8787878787878789, + 0.888888888888889, + 0.8989898989898991, + 0.9090909090909092, + 0.9191919191919192, + 0.9292929292929294, + 0.9393939393939394, + 0.9494949494949496, + 0.9595959595959597, + 0.9696969696969697, + 0.9797979797979799, + 0.98989898989899, + 1 + ], + "xaxis": "x", + "y": [ + 0, + 0.02620845649638624, + 0.05241691299277244, + 0.07862536948915867, + 0.10483382598554487, + 0.13104228248193112, + 0.15725073897831726, + 0.18345919547470355, + 0.2096676519710897, + 0.23587610846747598, + 0.26208456496386223, + 0.28829302146024843, + 0.3145014779566346, + 0.3407099344530209, + 0.3669183909494071, + 0.3931268474457933, + 0.4193353039421795, + 0.44554376043856575, + 0.47175221693495195, + 0.49796067343133815, + 0.5241691299277245, + 0.5503775864241106, + 0.5765860429204969, + 0.602794499416883, + 0.6290029559132692, + 0.6552114124096555, + 0.6814198689060418, + 0.7076283254024279, + 0.7338367818988142, + 0.7600452383952003, + 0.7862536948915866, + 0.8124621513879727, + 0.838670607884359, + 0.864879064380745, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807452, + 0.8648790643807452, + 0.8648790643807452, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807452, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807452, + 0.8648790643807451, + 0.8648790643807452, + 0.8648790643807451, + 0.8648790643807451, + 0.8648790643807452, + 0.8648790643807452, + 0.8648790643807452, + 0.8648790643807452, + 0.8648790643807449, + 0.8386706078843589, + 0.8124621513879725, + 0.7862536948915865, + 0.7600452383952, + 0.7338367818988139, + 0.7076283254024278, + 0.6814198689060414, + 0.6552114124096553, + 0.6290029559132689, + 0.6027944994168828, + 0.5765860429204968, + 0.5503775864241103, + 0.5241691299277244, + 0.49796067343133793, + 0.47175221693495173, + 0.44554376043856536, + 0.41933530394217916, + 0.39312684744579335, + 0.3669183909494069, + 0.34070993445302056, + 0.3145014779566342, + 0.2882930214602484, + 0.26208456496386195, + 0.2358761084674756, + 0.20966765197108972, + 0.18345919547470338, + 0.15725073897831698, + 0.13104228248193056, + 0.10483382598554479, + 0.07862536948915835, + 0.052416912992772006, + 0.02620845649638615, + 0 + ], + "yaxis": "y" + } + ], + "layout": { + "autosize": false, + "height": 500, + "hovermode": "x", + "legend": { + "title": { + "text": "variable" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Manufactured solution of Poisson's equation" + }, + "width": 800, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "x" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "value" + } + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.express as px\n", + "\n", + "# Convert mesh coordinates and solutions to DataFrame for Plotly Express\n", + "import pandas as pd\n", + "data = pd.DataFrame({'x': points,\n", + " 'Exact solution': [u_exact(x) for x in points],\n", + " 'Numerical solution': [u_sol(x) for x in points]})\n", + "\n", + "# Create a Plotly Express figure with colors specified\n", + "fig = px.line(data, x='x', y=['Exact solution', 'Numerical solution'], title='Manufactured solution of Poisson\\'s equation',\n", + " color_discrete_map={'Exact solution': 'black', 'Numerical solution': 'blue'})\n", + "\n", + "fig.update_traces(mode=\"lines\", hovertemplate=None)\n", + "\n", + "# Set the figure size to achieve a 1:1 aspect ratio\n", + "fig.update_layout(\n", + " hovermode='x',\n", + " autosize=False,\n", + " width=800, # You can adjust this value to get the desired aspect ratio\n", + " height=500\n", + ")\n", + "\n", + "# Show the Plotly Express figure\n", + "fig.show()" + ] + } + ], + "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.9.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/jupyter_notebooks/day-1/tutorials/2_visualization.ipynb b/jupyter_notebooks/day-1/tutorials/2_visualization.ipynb new file mode 100644 index 0000000..40f1413 --- /dev/null +++ b/jupyter_notebooks/day-1/tutorials/2_visualization.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualizing simulation results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the simulation is performed in FEniCS and the results are obtained, this tutorial will show you how to save the output in the XDMF file format. XDMF is ideal for storing large-scale scientific data, especially for finite element simulations, thanks to its flexibility and efficiency." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "num_elements = 30\n", + "mesh = IntervalMesh(num_elements, 0, 1)\n", + "U = FunctionSpace(mesh, \"CG\", 1)\n", + "\n", + "u_D = Constant(0.0)\n", + "boundary = CompiledSubDomain(\"on_boundary\")\n", + "bc = DirichletBC(U, u_D, boundary)\n", + "u, v = TrialFunction(U), TestFunction(U)\n", + "\n", + "a = inner(grad(u), grad(v)) * dx\n", + "f_expr = Expression(\"pi*pi*sin(pi*x[0])\", pi=np.pi, degree=2)\n", + "L = f_expr * v * dx\n", + "\n", + "u_sol = Function(U, name = \"field\")\n", + "solve(a == L, u_sol, bc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Option 1: Write data efficiently using `with` syntax." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "FEniCS provides us with an XDMFFile class for efficiently handling XDMF files and storing simulation results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "with XDMFFile(\"output/result.xdmf\") as outfile:\n", + " outfile.write(u_sol)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's break down the command step by step:\n", + "\n", + "1. `XDMFFile`: This is a class in FEniCS used to write simulation data to an XDMF file. XDMF is an XML-based file format commonly used to store scientific data, especially for finite element simulations.\n", + "\n", + "2. `\"output/result.xdmf\"`: This is the file path and name where the XDMF file will be created or updated. In this case, the file will be named \"result.xdmf\" and will be located in the \"output\" directory (relative to the current working directory).\n", + "\n", + "3. `with`: This keyword is used to define a context manager in Python. It ensures that resources associated with the context (in this case, the XDMFFile object) are properly managed and released when the block of code inside the `with` statement is executed.\n", + "\n", + "4. `as outfile`: This assigns the XDMFFile object to the variable `outfile`, which can be used to interact with the file and write data.\n", + "\n", + "5. `outfile.write(u_sol)`: This line of code writes the data `u_sol` to the XDMF file. `u_sol` is the variable containing the solution. Note that the name that is passed on to the variable during its creation is the name that will appear in the visualization tool paraview.\n", + "\n", + "Overall, this command creates an XDMFFile object, opens the file \"output/result.xdmf\" for writing, writes the data contained in the `u_sol` variable to the file, and then automatically closes the file after the code block within the `with` statement is executed. This allows for efficient and controlled writing of simulation results to an XDMF file, which can later be visualized using tools like Paraview to analyze and interpret the simulation data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Option 2: Use this to write data when dealing with timeseries" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In engineering, numerous problems demand the consideration of multiple variables and time-steps, which subsequently leads to the need for writing these variables to a file in a time series format. In such cases, FEniCS offers a convenient solution through the utilization of the XDMFFile class, facilitating efficient storage of simulation results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**We can access the `parameters` of the `XDMFFile` object to control its behaviour:**\n", + "- **functions_share_mesh**: Default is false, it controls whether all functions on a single time step share the same mesh. If true the files created will be smaller and also behave better in Paraview.\n", + "- **rewrite_function_mesh**: Default settings is true, i.e, it controls whether the mesh will be rewritten every time step. If the mesh does not change this can be turned off to create smaller files. \n", + "- **flush_output**: Default is false, it controls the ability of Paraview to render during execution. If you are doing a time dependent analysis, setting it to true will allow you to visualize results during run." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "outfile = XDMFFile(\"output/result.xdmf\")\n", + "outfile.parameters[\"functions_share_mesh\"] = True\n", + "outfile.parameters[\"rewrite_function_mesh\"] = False\n", + "outfile.parameters[\"flush_output\"] = True\n", + "\n", + "time_step = 1\n", + "outfile.write(u_sol, time_step)\n", + "outfile.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At the end of the execution it is recommended to close the `XDMFFile` object." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/jupyter_notebooks/day-2/exercises/1_2d_3d_domains.ipynb b/jupyter_notebooks/day-2/exercises/1_2d_3d_domains.ipynb new file mode 100644 index 0000000..bf35635 --- /dev/null +++ b/jupyter_notebooks/day-2/exercises/1_2d_3d_domains.ipynb @@ -0,0 +1,168 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2D and 3D domains\n", + "\n", + "Implement the learning of exercise-1 from day-1 to solve the non-linear Poisson's equation on 2D and 3D domains. Feel free to create the mesh of your preference for the problem.\n", + "\n", + "- Download and install Paraview.\n", + "- Name the fields to be visualized. (To visualize a function in Paraview you have to name it in FEniCS. The way to do that is use the command `v.rename(\"name\", \"label\")`)\n", + "- Write to XDMF the error and the solution.\n", + "- Visualize the error and solution in Paraview\n", + "\n", + "Hint: Check day-1/tutorial-2 " + ] + }, + { + "cell_type": "code", + "execution_count": 302, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Update this mesh to a unit square mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "mesh = IntervalMesh(40, 0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 303, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max error:2.167e-02\n" + ] + } + ], + "source": [ + "V = FunctionSpace(mesh, 'Lagrange', 1)\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]\n", + "\n", + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "# Define variational problem\n", + "v = TestFunction(V)\n", + "du = TrialFunction(V)\n", + "u = Function(V) # most recently computed solution\n", + "F = inner(q(u)*nabla_grad(u), nabla_grad(v))*dx\n", + "\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-5\n", + "prm['newton_solver']['relative_tolerance'] = 1E-5\n", + "prm['newton_solver']['maximum_iterations'] = 25\n", + "\n", + "solver.solve()\n", + "\n", + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + }, + { + "cell_type": "code", + "execution_count": 293, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 293, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u_e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Export the error and solution vector to XDMF" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/exercises/2_boundary_conditions.ipynb b/jupyter_notebooks/day-2/exercises/2_boundary_conditions.ipynb new file mode 100644 index 0000000..d5a89ab --- /dev/null +++ b/jupyter_notebooks/day-2/exercises/2_boundary_conditions.ipynb @@ -0,0 +1,141 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Boundary conditions\n", + "\n", + "Implement the learning of exercise-2 from day-1 to solve the non-linear Poisson's equation with different boundary conditions. Feel free to create a 2D mesh of your preference for the problem and experiment with different boundary conditions. Write the results to XDMF and visualize them in PARAVIEW.\n", + "\n", + "See what happens to the error when you change the domain to a rectangular domain with dimensions $2 \\times 1$" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6, True)" + ] + }, + "execution_count": 300, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "\n", + "mesh = IntervalMesh(40, 0, 1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "top_boundary = CompiledSubDomain(\"on_boundary && near(x[1],1)\")\n", + "bottom_boundary = CompiledSubDomain(\"on_boundary && near(x[1],0)\")\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]\n", + "\n", + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "# Define variational problem\n", + "v = TestFunction(V)\n", + "du = TrialFunction(V)\n", + "u = Function(V) # most recently computed solution\n", + "F = inner(q(u)*nabla_grad(u), nabla_grad(v))*dx\n", + "\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-5\n", + "prm['newton_solver']['relative_tolerance'] = 1E-5\n", + "prm['newton_solver']['maximum_iterations'] = 25\n", + "\n", + "solver.solve()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 301, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 301, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/exercises/3_non_linearity_tolerances.ipynb b/jupyter_notebooks/day-2/exercises/3_non_linearity_tolerances.ipynb new file mode 100644 index 0000000..d8f144e --- /dev/null +++ b/jupyter_notebooks/day-2/exercises/3_non_linearity_tolerances.ipynb @@ -0,0 +1,155 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tolerances and convergence\n", + "\n", + "In numerical methods, solving non-linear problems poses unique challenges due to their intrinsic complexity. Solver design become crucial aspect to consider while tackling these problems, as they govern the accuracy and reliability of the obtained solutions. \n", + "\n", + "Understanding tolerance levels, which dictate the acceptable deviation between successive iterations, and convergence criteria, which indicate when a solution has reached a satisfactory result is of prime importance when handling non-linear problems.\n", + "\n", + "In this exercise, your task is to explore the impact of modifying three parameters: absolute tolerance, relative tolerance, and maximum iterations, on the computational cost and solution accuracy. By adjusting these parameters, you will gain insights into how they influence the numerical solution of the problem at hand." + ] + }, + { + "cell_type": "code", + "execution_count": 308, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "\n", + "mesh = IntervalMesh(40, 0, 1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]\n", + "\n", + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "# Define variational problem\n", + "v = TestFunction(V)\n", + "du = TrialFunction(V)\n", + "u = Function(V) # most recently computed solution\n", + "F = inner(q(u)*nabla_grad(u), nabla_grad(v))*dx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Change the tangent modifer to a value between 0.5 and 1 and see how it affects the solution." + ] + }, + { + "cell_type": "code", + "execution_count": 309, + "metadata": {}, + "outputs": [], + "source": [ + "tangent_modifier = 1\n", + "J = derivative(tangent_modifier*F, u, du)" + ] + }, + { + "cell_type": "code", + "execution_count": 310, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Change the tolerances and maximum_iterations to see what happens to the solution in terms of computational cost and solution accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 311, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of iterations: 6\n", + "The solver converged.\n" + ] + } + ], + "source": [ + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-5\n", + "prm['newton_solver']['relative_tolerance'] = 1E-5\n", + "prm['newton_solver']['maximum_iterations'] = 25\n", + "\n", + "iterations, converged = solver.solve()\n", + "print(\"Number of iterations: {}\".format(iterations))\n", + "print(\"The solver converged.\" if converged else \"The solver did not converge.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 312, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max error:1.559e-06\n" + ] + } + ], + "source": [ + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/exercises/4_manual_auto_differentiation.ipynb b/jupyter_notebooks/day-2/exercises/4_manual_auto_differentiation.ipynb new file mode 100644 index 0000000..02b6f82 --- /dev/null +++ b/jupyter_notebooks/day-2/exercises/4_manual_auto_differentiation.ipynb @@ -0,0 +1,134 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Automatic Differentiation\n", + "Automatic Differentiation (AD) is a powerful computational tool that has revolutionized various fields, particularly in mathematics, physics, engineering, and machine learning. It provides a systematic and efficient way to compute derivatives of complex mathematical functions, allowing us to effortlessly obtain accurate and reliable gradients. This capability of AD brings a multitude of benefits, enabling faster and more robust optimization, enhancing the performance of machine learning models, and facilitating the solution of intricate differential equations.\n", + "\n", + "In this exercise you have to use both manual differentiation and automatic differentiation to find the solution of the following Poisson's equation.\n", + "\n", + "$$-div(q(u)*\\Delta(u)) = 0,$$\n", + "$$u = 0\\text{ at }x=0, u=1\\text{ at }x=1$$\n", + "$$q(u) = (1+2u+4u^3)$$" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(4, True)" + ] + }, + "execution_count": 172, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "\n", + "mesh = IntervalMesh(40, 0, 1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]\n", + "\n", + "m = 2\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "# Define variational problem\n", + "v = TestFunction(V)\n", + "du = TrialFunction(V)\n", + "u = Function(V) # most recently computed solution\n", + "F = inner(q(u)*nabla_grad(u), nabla_grad(v))*dx\n", + "\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-5\n", + "prm['newton_solver']['relative_tolerance'] = 1E-5\n", + "prm['newton_solver']['maximum_iterations'] = 25\n", + "\n", + "solver.solve()" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 173, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/tutorials/1_non_linear_poisson_picard.ipynb b/jupyter_notebooks/day-2/tutorials/1_non_linear_poisson_picard.ipynb new file mode 100644 index 0000000..ff2e811 --- /dev/null +++ b/jupyter_notebooks/day-2/tutorials/1_non_linear_poisson_picard.ipynb @@ -0,0 +1,252 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nonlinear Poisson equation\n", + "\n", + "$$-div(q(u)*\\Delta(u)) = 0,$$\n", + "$$u = 0\\text{ at }x=0, u=1\\text{ at }x=1$$\n", + "$$q(u) = (1+u)^m$$\n", + "\n", + "Solution method: Picard iteration (successive substitutions).\n", + "\n", + "Picard iteration is a simple and widely used technique for solving nonlinear equations. It is based on the idea of reformulating the original equation as a fixed-point problem. The method involves iteratively updating the solution until it converges to the desired solution.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "\n", + "mesh = IntervalMesh(40, 0, 1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [], + "source": [ + "# Define boundary conditions\n", + "\n", + "tol = 1E-14\n", + "\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [], + "source": [ + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "\n", + "# Define variational problem for Picard iteration\n", + "u = TrialFunction(V)\n", + "v = TestFunction(V)\n", + "u_k = interpolate(Constant(0.0), V) # previous (known) u\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = inner(q(u_k)*nabla_grad(u), nabla_grad(v))*dx\n", + "f = Constant(0.0)\n", + "L = f*v*dx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Absolute tolerance and relative tolerance are two different concepts used to define the acceptable level of error or difference between two values when comparing them, especially in numerical computations, algorithms, and simulations.\n", + "\n", + "1. Absolute Tolerance:\n", + "Absolute tolerance is a fixed value that represents the maximum allowable difference between two values. It is independent of the magnitude or scale of the values being compared. If the absolute difference between the two values is smaller than the absolute tolerance, they are considered to be equal or within the acceptable range.\n", + "\n", + "1. Relative Tolerance:\n", + "Relative tolerance, on the other hand, takes into account the magnitude or scale of the values being compared. It defines an acceptable percentage or fraction of relative difference between two values. \n", + "\n", + "The idea is that the relative tolerance allows for more significant differences between large values and smaller differences between small values. This is especially useful when dealing with numbers of varying magnitudes.\n", + "\n", + "In summary, absolute tolerance is a fixed value used to check the maximum allowable difference, while relative tolerance is a percentage or fraction-based value that scales with the magnitude of the numbers being compared. Depending on the situation and the nature of the values being compared, one or both types of tolerances may be used to ensure accurate and meaningful comparisons." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Picard iterations\n", + "u = Function(V) # new unknown function\n", + "absolute_error = 1.0 # error measure ||u-u_k||\n", + "relative_error = 1.0\n", + "absolute_tolerance = 1.0E-5 # tolerance\n", + "relative_tolerance = 1.0E-5\n", + "iter = 0 # iteration counter\n", + "maxiter = 25 # max no of iterations allowed" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iter = 1, absolute_error = 3.72e+00, relative_error = 1.00e+00\n", + "iter = 2, absolute_error = 1.79e+00, relative_error = 4.80e-01\n", + "iter = 3, absolute_error = 3.56e-01, relative_error = 7.04e-02\n", + "iter = 4, absolute_error = 3.64e-01, relative_error = 7.60e-02\n", + "iter = 5, absolute_error = 9.05e-02, relative_error = 1.89e-02\n", + "iter = 6, absolute_error = 9.63e-02, relative_error = 1.99e-02\n", + "iter = 7, absolute_error = 2.93e-02, relative_error = 6.01e-03\n", + "iter = 8, absolute_error = 2.47e-02, relative_error = 5.07e-03\n", + "iter = 9, absolute_error = 1.00e-02, relative_error = 2.06e-03\n", + "iter = 10, absolute_error = 5.94e-03, relative_error = 1.22e-03\n", + "iter = 11, absolute_error = 3.27e-03, relative_error = 6.73e-04\n", + "iter = 12, absolute_error = 1.36e-03, relative_error = 2.80e-04\n", + "iter = 13, absolute_error = 1.01e-03, relative_error = 2.08e-04\n", + "iter = 14, absolute_error = 3.06e-04, relative_error = 6.28e-05\n", + "iter = 15, absolute_error = 2.97e-04, relative_error = 6.09e-05\n", + "iter = 16, absolute_error = 7.57e-05, relative_error = 1.56e-05\n", + "iter = 17, absolute_error = 8.20e-05, relative_error = 1.68e-05\n", + "iter = 18, absolute_error = 2.31e-05, relative_error = 4.75e-06\n", + "iter = 19, absolute_error = 2.14e-05, relative_error = 4.40e-06\n", + "iter = 20, absolute_error = 7.85e-06, relative_error = 1.61e-06\n" + ] + } + ], + "source": [ + "while (absolute_error > absolute_tolerance or relative_error > relative_tolerance) and iter < maxiter:\n", + " iter += 1\n", + " solve(a == L, u, bcs)\n", + " diff = u.vector().vec().array - u_k.vector().vec().array\n", + " absolute_error = numpy.linalg.norm(diff)\n", + " if iter > 1:\n", + " relative_error = absolute_error / \\\n", + " min(numpy.linalg.norm(u.vector()[:]),\n", + " numpy.linalg.norm(u_k.vector()[:]))\n", + " print('iter ={0:3d}, absolute_error = {1:5.2e}, relative_error = {2:5.2e}'.format(\n", + " iter, absolute_error, relative_error))\n", + " u_k.assign(u) # update for next iteration" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl4lfWd9/H3NwkkLCEJJATIyhJ2I0sEUWtR1CK1ZVpbly7aaqW11aetM16PHadOH/tcM7Zebaczj9PKWLXails7lbZYrBtYZAuL7EsIWVkSspOQ9fyeP07qRArkCCfnPsvndV1cV845P3I+d5YPN7/7vn+3OecQEZHoEud1ABERCT6Vu4hIFFK5i4hEIZW7iEgUUrmLiEQhlbuISBRSuYuIRCGVu4hIFFK5i4hEoQSv3jg9Pd3l5+d79fYiIhFpy5YtJ5xzGf2N86zc8/PzKS4u9urtRUQikpmVBzJO0zIiIlFI5S4iEoVU7iIiUUjlLiIShVTuIiJRqN9yN7MnzazGzHad5XUzs383sxIz22Fmc4IfU0REPoxA9tyfBhaf4/XrgYLeP8uAn114LBERuRD9lrtzbi1Qf44hS4FnnN8GINXMxgYroIhINGhs6+Tt/TX82+sH2FXdNODvF4yLmLKAyj6Pq3qfO3r6QDNbhn/vntzc3CC8tYhI+Ons9rHvWDPbKxvZXtHI9spGSk+0AmAGo4YnMjMrZUAzhPQKVefccmA5QFFRke7MLSJR4WjTKbZVNLK1vIFtlY3srG6is9sHQPrwRGblpHLj3Gxm5aRSmJ1CctKgAc8UjHKvBnL6PM7ufU5EJOq0d/Ww+0gTW8sb2VbZwLaKRo42tQMwOCGOwqwUbrs0j1m5qczKSSUrdQhmFvKcwSj3lcA9ZvY8MB9ocs79zZSMiEgkOtbUzpbyBrZWNLClvIHdR5ro6vFPPOSMHMIl+SOZnZvKnNw0po0dweCE8DjDvN9yN7MVwEIg3cyqgH8GBgE4534OrAKWACVAG/DlgQorIjKQunt87DnazJZyf5Fvq2ikuvEUAIkJcRRmp3DHFeOZk5vG7NxURicneZz47Potd+fcrf287oBvBC2RiEiINJ3qYmtFA1vLGygua2B7ZSOnunoAGJeSxJy8NO68Yjxz88JrrzwQni35KyISSs45qhtPUVzWwOayeorLGjhQ04JzEB9nTB87gpsvyWFuXhpF+WmMTRnideQLonIXkajU43PsP9ZCcXk9m8saKC6rf//AZ3JiArPz0vh44ViK8tK4OCeVYYnRVYfRtTUiErM6u33srG5k0+EGNh2uo7i8gZb2bgAyRyRySf7I9/9MGZNMfFzoz2AJJZW7iESkts5utlU0svFwPZsO17GtopGO3nPLJ2YM44bCse+XeXaaN6cjeknlLiIR4WRHN8Vl9Ww8XM+G0jp2VjXR7XPEGUwfN4LPz89j3vg0ivJHkj480eu4nlO5i0hYam7vYvNhf5lvLK1j15FmenyOhDijMDuFu66cwLzxIynKSwvJFZ+RRuUuImHhZEc3m3v3yteX1rGrugmfg8HxcczKSeXrCycyf/wo5uSlMnSwqqs/+gqJiCfaOrspLmtgfWkd6w/VsbO6iR6fY1C8MTsnjXuuLuDSCSOZk5tG0qB4r+NGHJW7iIREZ7eP7ZWNvHvoBO+W1LGtsoGuHv80y8U5qdz90YksmDiKOblpDBmsMr9QKncRGRA+n2P3kWbWHTrBu4fq2Hy4nlNdPZjBRVn+y/gvm5jOJflpmmYZAPqKikjQVNS18ZeSE6wrOcG6QydobOsCYHLmcG6+JIcFE0dx6fhRpAzVAdCBpnIXkfPW0NrJu4fq+EtJLX8pOUFlvX+RrbEpSVwzLZMrJqVz2cRRjB4RvgtsRSuVu4gErLPbx7aKBt45eIJ3Dtayo7oJ5yA5KYEFE0Zx10cmcPmkdCakD4u5i4bCjcpdRM7KOUdZXRtrD9TyzsFa1h+qo7Wzh/g4Y3ZOKt9aNJkrCtK5ODuFhPjIWTExFqjcReQDWju6WX+ojjUHallzoJaK+jYA8kYN5VNzsvhIQQYLJo5ihC4cCmsqd5EY55xj//EW1uz3l/nmsnq6ehxDB8dz2cRR3PWR8Vw5OYO8UcO8jiofgspdJAad7OhmXckJ3t5fw1v7ajnW7F8Kd+qYZO64fDwfnZzB3Pw0EhN0vnmkUrmLxADnHIdqW/1lvr+GTYf9e+fJiQlcUZDOwikZfHTyaMak6KyWaKFyF4lSHd09bDpczxt7a3hzX837c+eTM4dzx+XjuWrqaObmpTFIB0KjkspdJIqcONnBW/v8Zb72QC2tnT0kJsRx+aR0ll05gYVTMshOG+p1TAkBlbtIBHPOcbDmJH/ec5zX9x5ne2UjzsGYEUksnZ3FoqmjuWxiutZqiUEqd5EI093jY0t5A3/ec5w/7z1OeZ1/uqUwO4VvLZrMommjmTFuhC4iinEqd5EI0NbZzdoDtby25zhv7auhoa2LwfFxXDZpFMuunMA10zLJ1CX+0ofKXSRMNbZ18sbeGv60+xhrD9TS0e0jZcggrp46mmunZ3Ll5AyGJ+pXWM5MPxkiYeR4czuv7T7G6t3HWV9aR4/PMTYliVvn5XLdjEzm5Y/UZf4SEJW7iMeqGtr4065jrNp5lK0VjQBMyBjGV6+cwMdmjKEwO0Xz5/KhqdxFPFBR18aru46yaudR3qtqAmDGuBH8w3WTWTxzDJNGJ3ucUCKdyl0kRMrrWvnDjqO8uusou6qbAf8ZLg9cP5XrZ47R2i0SVCp3kQFU1dDGH3cc5Q87jrKz2r+HPjs3lQeXTGPxzDHkjNQFRTIwVO4iQXa8ub230I+8P4demJ3Cg0umsaRwLFmpQzxOKLEgoHI3s8XAT4F44Ann3COnvZ4L/BJI7R3zgHNuVZCzioStxrZOVu08xivbq9lUVo9zMG3sCO7/2BRuKByrKRcJuX7L3czigceAa4EqYLOZrXTO7ekz7J+AF51zPzOz6cAqIH8A8oqEjVOdPby+9zivbD/CmgM1dPU4JmQM45uLCrihcByTRg/3OqLEsED23OcBJc65UgAzex5YCvQtdweM6P04BTgSzJAi4aK7x8e6Q3W8sr2a1buO0drZQ+aIRL50WT5LZ2Xpsn8JG4GUexZQ2edxFTD/tDHfA14zs3uBYcA1QUknEib2HGnmt1ur+N32I5w42UFyUgI3FI5j6axxzJ8wivg4FbqEl2AdUL0VeNo59yMzWwA8a2YznXO+voPMbBmwDCA3NzdIby0yMGqa23ll+xF+s7WKfcdaGBRvXD11NJ+ancXCKaNJGqSVFiV8BVLu1UBOn8fZvc/1dSewGMA5t97MkoB0oKbvIOfccmA5QFFRkTvPzCIDpr2rh9W7j/HbrdW8c7AWn4NZOal8f+kMbigcR9qwwV5HFAlIIOW+GSgws/H4S/0W4HOnjakAFgFPm9k0IAmoDWZQkYHinGNndRMvFlfyyvYjtLR3My4libsXTuRTs7N1YFQiUr/l7pzrNrN7gNX4T3N80jm328weBoqdcyuBvwf+y8y+jf/g6pecc9ozl7BW39rJf2+r5qXiSvYdayExIY7rZ47hs0U5LJgwijjNo0sEM686uKioyBUXF3vy3hK7enyOtQdream4kj/vOU5Xj+PinFQ+OzebT1w8jpQhg7yOKHJOZrbFOVfU3zhdoSox4VhTOy8WV/LC5kqqG08xathgbl+Qz2eLcpgyRot0SfRRuUvU6vE51hyo4bmNlby57zg+Bx8pSOfBj0/jmmmZDE7QuugSvVTuEnWONbXzwuZKXthcwZGmdtKHD+arH53ILZfkaBkAiRkqd4kKzjnWl9bx7PpyXttznB6f4yMF6Xz3huks0l66xCCVu0S0lvYu/ntbNc+uL+dgzUlShw7izivG8/n5udpLl5imcpeIdPB4C8+sL+e3W6to7eyhMDuFRz9TyCcuHqcrR0VQuUsE8fkcaw7U8uS6w7xz8ASDE+K4oXAsty3IZ1ZOqtfxRMKKyl3CXmtHN7/dWsVT68ooPdFK5ohE7v/YFG6dl8tILQcgckYqdwlb1Y2neObdMlZsqqC5vZuLs1P46S2zWHLRWAbF6wCpyLmo3CXs7Kxq4vG1h3h11zEAFs8cwx2Xj2dObqrWShcJkMpdwoJzjrUHT/D4mkO8e6iO5MQEvnLFeG67LF/3HBU5Dyp38VRXj48/7DjC42tK2XeshcwRifzjkqncOi+X5CSt8yJyvlTu4om2zm5WbKrkF++UcqSpnYLRw3n0M4UsnZWlC45EgkDlLiHV3N7Fs+vL+cVfDlPf2sm88SP5v5+aycLJo7XErkgQqdwlJBpaO3lq3WGeereMlvZurpqSwT1XT2Ju3kivo4lEJZW7DKjalg6e+Espv1pfTmtnDx+bkcm9VxcwMyvF62giUU3lLgOipqWdn719iOc2VtDV4+OGwnF846pJWjtdJERU7hJU9a2dPL7mEL9cX0ZXj+NTs7P4+sKJTMjQfUhFQknlLkHRdKqLX7xTyi/+cpi2rh7+blYW31xUQH66VmYU8YLKXS7IyY5unl53mOVrS2lu7+bjF43lW9cUUJCp6RcRL6nc5bx0dPfwqw0VPPZWCfWtnVwzbTTfvnYyM8bpQKlIOFC5y4fi8zl+v+MIj67eT1XDKa6YlM4/fGyKltwVCTMqdwnYuyUn+NdX97GzuolpY0fwzB0XceXkDK9jicgZqNylX/uONfPIq/t4e38t41KS+PFNF/N3s7J0RalIGFO5y1nVNLfz6Or9vLy1iuGJCXzn+qncflm+bmMnEgFU7vI3Orp7eGpdGf/xxkE6e3zcefl4vnHVJNJ01yORiKFylw94c99xHv79Hsrq2lg0dTT/dMN0xutcdZGIo3IXAA7VnuT7f9jD2/trmZAxjKe/fAkLp4z2OpaInCeVe4xrae/iP94s4al1h0lMiOfBJdO4/bJ8rakuEuFU7jHKOceru47xvZW7qWnp4KaibO7/2FQykhO9jiYiQaByj0FVDW388yu7eWNfDdPHjmD5bUW6CEkkygRU7ma2GPgpEA884Zx75AxjbgK+BzjgPefc54KYU4Kgu8fH0++W8aPXDgDw4JJpfPnyfBLiNQUjEm36LXcziwceA64FqoDNZrbSObenz5gC4DvA5c65BjPTkbgws6Oqke/8die7jzRz9dTRPLx0BtlpQ72OJSIDJJA993lAiXOuFMDMngeWAnv6jLkLeMw51wDgnKsJdlA5P60d3Ty6ej/PrC8jfXgi//n5OVw/cwxmurpUJJoFUu5ZQGWfx1XA/NPGTAYws3X4p26+55z70+mfyMyWAcsAcnNzzyevfAgbSuu4/+X3qGo4xRfm53H/4imMSBrkdSwRCYFgHVBNAAqAhUA2sNbMLnLONfYd5JxbDiwHKCoqckF6bzlNe1cPP/zTfp569zC5I4fywrIFzBuvG1GLxJJAyr0ayOnzOLv3ub6qgI3OuS7gsJkdwF/2m4OSUgK2raKBv3/pPUprW7ltQR4PXD+VoYN1UpRIrAnkt34zUGBm4/GX+i3A6WfC/A64FXjKzNLxT9OUBjOonFtHdw///sZBfvb2IcaMSOJXd87nioJ0r2OJiEf6LXfnXLeZ3QOsxj+f/qRzbreZPQwUO+dW9r52nZntAXqA+51zdQMZXP7HniPN3PfidvYda+Gmomz+6YbpmlsXiXHmnDdT30VFRa64uNiT944WzjmeWlfGv766l9Shg3nk0xexaFqm17FEZACZ2RbnXFF/4zQZG6Ea2zr5h5d28Pre41wzLZNHP1OoJXlF5H0q9whUXFbP/1qxjdqTHTx0w3S+fHm+zlsXkQ9QuUcQn8/xszWH+PGfD5CdNoTf3H0ZhdlaE0ZE/pbKPULUtnRw34vbeefgCT5x8Tj+5VMzSdZBUxE5C5V7BFh/qI57V2yjpb2LRz59ETdfkqNpGBE5J5V7GHPO8cz6ch7+wx7Gpw/j11+Zz5QxyV7HEpEIoHIPUx3dPTz0u928UFzJNdMy+cnNF2saRkQCpnIPQzUt7dz9q61sKW/g3qsn8e1rJhMXp2kYEQmcyj3M7Khq5KvPbqGxrYvHPjeHjxeO9TqSiEQglXsY+d22av73b3aQPjyRl+9ewIxxKV5HEpEIpXIPAz0+xw9X7+PxNaXMHz+S//z8HEYN142qReT8qdw91tHdw30vvscfdxzlC5fm8s+fmMEg3dNURC6Qyt1DJzu6+eqzxawrqeMfl0xl2ZUTvY4kIlFC5e6REyc7+NJTm9h7tIUfffZibpyb7XUkEYkiKncPVNa38cVfbORYcztP3FbEVVNHex1JRKKMyj3E9hxp5vanNtHZ7ePXX7mUuXlpXkcSkSikcg+hDaV13PXLYoYnJfDc1xZQkKmlBERkYKjcQ2T17mPcu2IbuSOH8swd8xiXOsTrSCISxVTuIfDa7mN849dbmZmVwlNfukR3TBKRAadyH2Bv7a/hG89tZUZWCs/eOU+Lf4lISOhqmQG0ruQEX3t2C5Mzk3nmyyp2EQkdlfsA2XS4nq/8spj8UcN49s75pAxVsYtI6KjcB8DWiga+/NQmxqUm8auvzGek5thFJMRU7kG2s6qJ25/cRHpyIs/ddSkZyVoATERCT+UeRHuPNvPFJzcyImkQz911KZkjkryOJCIxSuUeJIdqT/KFJzaSlBDPirsuJUvnsYuIh1TuQdDQ2skdT28G4Lm75pM7aqjHiUQk1uk89wvU1ePj7l9v4WhjOyuWzWdCxnCvI4mIqNwvhHOOh17ZzYbSen5808XMzRvpdSQREUDTMhfk6XfLWLGpgrsXTuTTc7Qeu4iEj4DK3cwWm9l+MysxswfOMe5GM3NmVhS8iOHp7f01fP8Pe7hueib3XzfF6zgiIh/Qb7mbWTzwGHA9MB241cymn2FcMvBNYGOwQ4abkpoW7n1uG1PGjOAnN88iLs68jiQi8gGB7LnPA0qcc6XOuU7geWDpGcZ9H/gB0B7EfGHHf2ZMMYmD4nni9iKGJeqwhYiEn0DKPQuo7PO4qve595nZHCDHOffHIGYLO53dPr72qy0ca25n+W1zdS67iIStCz6gamZxwI+Bvw9g7DIzKzaz4tra2gt965B76JVdbDxczw9vLGROrm6PJyLhK5ByrwZy+jzO7n3ur5KBmcDbZlYGXAqsPNNBVefccudckXOuKCMj4/xTe+CV7dU8v7mSry+cyN/Nzur/L4iIeCiQct8MFJjZeDMbDNwCrPzri865JudcunMu3zmXD2wAPumcKx6QxB440niK7/5uF7NzU7nv2slexxER6Ve/5e6c6wbuAVYDe4EXnXO7zexhM/vkQAf0ms/nuP/l9+j2OX5y0ywS4nVpgIiEv4BO9XDOrQJWnfbcQ2cZu/DCY4WPp98tY11JHf/66YvITx/mdRwRkYBoN/QcDh5v4ZE/7WPR1NHccklO/39BRCRMqNzPorPbxzef305yYgKP3FiImS5UEpHIoStwzuLfXj/AnqPNLP/iXN1NSUQijvbcz2BzWT0/X3OIm4tyuG7GGK/jiIh8aCr305zs6Oa+F7eTlTaE737ib5bQERGJCJqWOc3Dv99NdcMpXvzqAoZr3RgRiVDac+/jtd3HeLG4irsXTqQoXzfeEJHIpXLv1d7Vw//5/R6mjknmm4t0FaqIRDaVe69n1pdR3XiK794wncEJ+rKISGRTi+Ffo/3/vVnCVVMyuHxSutdxREQumMod+I83SzjZ0c13lkzzOoqISFDEfLmX17Xy7IYybirKYXJmstdxRESCIubL/Yer95MQF6elfEUkqsR0uW+raOCPO45y15UTGD0iyes4IiJBE7Pl7pzjX1btJX14Il+9coLXcUREgipmy/21PcfZXNbAt68tYJiuRBWRKBOT5d7V4+MHr+5j0ujh3FykddpFJPrEZLmv2FRB6YlWHlg8VbfNE5GoFHPN1tLexU9fP8ilE0ayaNpor+OIiAyImJts/vmaQ9S1dvL0kum6u5KIRK2Y2nM/3tzOE+8cZumscVyUneJ1HBGRARNT5b5iUwUd3T5dsCQiUS9myr3H53hhcyUfKUgnb9Qwr+OIiAyomCn3NQdqONrUzufm5XodRURkwMVMua/YVEn68MEsmpbpdRQRkQEXE+V+vLmdN/fV8Jm5OboRh4jEhJhoupeKK+nxOW65RFejikhsiPpy9/kcKzZVctnEUeSn60CqiMSGqC/3d0pOUN14ilt1IFVEYkjUl/vzmyoYOWww183QgVQRiR1RXe61LR38ec9xbpyTRWJCvNdxRERCJqByN7PFZrbfzErM7IEzvH6fme0xsx1m9oaZ5QU/6of38pYqun2OWzQlIyIxpt9yN7N44DHgemA6cKuZTT9t2DagyDlXCLwM/DDYQT8sn8/x/OYK5o8fycSM4V7HEREJqUD23OcBJc65UudcJ/A8sLTvAOfcW865tt6HG4Ds4Mb88NaX1lFe16YDqSISkwIp9yygss/jqt7nzuZO4NUzvWBmy8ys2MyKa2trA095HlZsqiBlyCAWzxwzoO8jIhKOgnpA1cy+ABQBj57pdefccudckXOuKCMjI5hv/QF1JztYvfsYN87JJmmQDqSKSOwJ5GYd1UDfSzuze5/7ADO7BngQ+KhzriM48c7Pb7ZW0dXjuHWerkgVkdgUyJ77ZqDAzMab2WDgFmBl3wFmNht4HPikc64m+DED55zj+U2VFOWlUZCZ7GUUERHP9Fvuzrlu4B5gNbAXeNE5t9vMHjazT/YOexQYDrxkZtvNbOVZPt2A23i4ntITrTqQKiIxLaB7qDrnVgGrTnvuoT4fXxPkXOft+U0VJCclsOSisV5HERHxTFRdoerzOd7YV8OSmWMZMlgHUkUkdkVVuZfUnqSlvZt540d6HUVExFNRVe5byhsAmJOX5nESERFvRV25jxw2mPxRQ72OIiLiqagq960VDczJTcPMvI4iIuKpqCn3+tZOSmtbmZOX6nUUERHPRU25b6vwz7fPzdV8u4hI1JT71ooGEuKMwmztuYuIRE25bylvYMa4ETq/XUSEKCn3rh4f71U2MVtTMiIiQJSU+76jLZzq6mGuzm8XEQGipNy3/vVgqspdRASIknLfUt7A2JQkxqUO8TqKiEhYiJpyn6P5dhGR90V8uR9vbqe68ZTWkxER6SPiy31ruebbRUROF/HlvqW8gcSEOKaPHeF1FBGRsBH55V7RQGF2CoMTIn5TRESCJqIbsb2rh93VzZpvFxE5TUSX++4jTXT2+LRYmIjIaSK63HXnJRGRM4voct9a3kjeqKGkD0/0OoqISFiJ2HJ3zrGlokFTMiIiZxCx5V7VcIralg5ma0pGRORvRGy5b9Wdl0REzipiy31LeQPDBsczZUyy11FERMJORJf77Nw04uPM6ygiImEnIsu9taObvUebmZOr+6WKiJxJRJb7e1WN+JzObxcROZuILPe/rgSpe6aKiJxZQOVuZovNbL+ZlZjZA2d4PdHMXuh9faOZ5Qc7aF9byhsoGD2clCGDBvJtREQiVr/lbmbxwGPA9cB04FYzm37asDuBBufcJOAnwA+CHfSvfD7HtspGrd8uInIOgey5zwNKnHOlzrlO4Hlg6WljlgK/7P34ZWCRmQ3IaSylJ1ppbOvSfLuIyDkEUu5ZQGWfx1W9z51xjHOuG2gCRgUj4Ol05yURkf6F9ICqmS0zs2IzK66trT2vz5E6dBDXTs9kQvqwIKcTEYkegZR7NZDT53F273NnHGNmCUAKUHf6J3LOLXfOFTnnijIyMs4r8HUzxvBftxUxQLM+IiJRIZBy3wwUmNl4MxsM3AKsPG3MSuD23o8/A7zpnHPBiykiIh9GQn8DnHPdZnYPsBqIB550zu02s4eBYufcSuAXwLNmVgLU4/8HQEREPNJvuQM451YBq0577qE+H7cDnw1uNBEROV8ReYWqiIicm8pdRCQKqdxFRKKQyl1EJAqp3EVEopB5dTq6mdUC5ef519OBE0GMEwm0zbFB2xwbLmSb85xz/V4F6lm5XwgzK3bOFXmdI5S0zbFB2xwbQrHNmpYREYlCKncRkSgUqeW+3OsAHtA2xwZtc2wY8G2OyDl3ERE5t0jdcxcRkXMI63IPtxtzh0IA23yfme0xsx1m9oaZ5XmRM5j62+Y+4240M2dmEX9mRSDbbGY39X6vd5vZc6HOGGwB/GznmtlbZrat9+d7iRc5g8XMnjSzGjPbdZbXzcz+vffrscPM5gQ1gHMuLP/gX174EDABGAy8B0w/bczXgZ/3fnwL8ILXuUOwzVcBQ3s/vjsWtrl3XDKwFtgAFHmdOwTf5wJgG5DW+3i017lDsM3Lgbt7P54OlHmd+wK3+UpgDrDrLK8vAV4FDLgU2BjM9w/nPfewujF3iPS7zc65t5xzbb0PN+C/M1YkC+T7DPB94AdAeyjDDZBAtvku4DHnXAOAc64mxBmDLZBtdsCI3o9TgCMhzBd0zrm1+O9vcTZLgWec3wYg1czGBuv9w7ncw+rG3CESyDb3dSf+f/kjWb/b3Pvf1Rzn3B9DGWwABfJ9ngxMNrN1ZrbBzBaHLN3ACGSbvwd8wcyq8N8/4t7QRPPMh/19/1ACulmHhB8z+wJQBHzU6ywDyczigB8DX/I4Sqgl4J+aWYj/f2drzewi51yjp6kG1q3A0865H5nZAvx3d5vpnPN5HSwShfOee9BuzB1BAtlmzOwa4EHgk865jhBlGyj9bXMyMBN428zK8M9Nrozwg6qBfJ+rgJXOuS7n3GHgAP6yj1SBbPOdwIsAzrn1QBL+NViiVUC/7+crnMs9Fm/M3e82m9ls4HH8xR7p87DQzzY755qcc+nOuXznXD7+4wyfdM4VexM3KAL52f4d/r12zCwd/zRNaShDBlkg21wBLAIws2n4y702pClDayVwW+9ZM5cCTc65o0H77F4fUe7naPMS/Hssh4AHe597GP8vN/i/+S8BJcAmYILXmUOwza8Dx4HtvX9Wep15oLf5tLFvE+FnywT4fTb801F7gJ3ALV5nDsE2TwfW4T+TZjtwndeZL3B7VwBHgS78/xO7E/ga8LU+3+PHer/p0y6kAAAAQElEQVQeO4P9c60rVEVEolA4T8uIiMh5UrmLiEQhlbuISBRSuYuIRCGVu4hIFFK5i4hEIZW7iEgUUrmLiESh/w+SYAT7a7llwgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u_k)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max error:1.208e-06\n" + ] + } + ], + "source": [ + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/tutorials/2_non_linear_poisson_newton.ipynb b/jupyter_notebooks/day-2/tutorials/2_non_linear_poisson_newton.ipynb new file mode 100644 index 0000000..74fff5a --- /dev/null +++ b/jupyter_notebooks/day-2/tutorials/2_non_linear_poisson_newton.ipynb @@ -0,0 +1,330 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nonlinear Poisson equation \n", + "\n", + "$$-div(q(u)*\\Delta(u)) = 0,$$\n", + "$$u = 0\\text{ at }x=0, u=1\\text{ at }x=1$$\n", + "$$q(u) = (1+u)^m$$\n", + "\n", + "Solution method: Newton method\n", + "\n", + "Newton iteration is a more sophisticated method for solving nonlinear equations and systems. It is based on linearizing the original problem around an initial guess and then iteratively improving the solution by solving linear approximations of the problem.\n", + "\n", + "The Newton method is known for its quadratic convergence, which means that the number of correct digits in the solution roughly doubles with each iteration, making it faster than Picard iteration for problems where it converges." + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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D3ur1Ur//v3p1KmTy9J0VkhICJdccolHhwn6sg5T0wc04KtW0c+P6gimT5/OyJEjXRagS0pKsNlsnHfeeS5Jr7kKCwupqKjA39/fK/n7mg5T01dKKdW0wMBAlzaFHzlyBBEhOjraZWk6q6ysjM2bN7N27VqP5+2rNOgrpZQCYPv27axdu9al4/MjIyO58MILvTI+/8SJEwDaia8GDfrKZfbt28fNN9/M1VdfzSuvvOKRPD/55BN+/etfc+211/Lll196JE+l2qvNmzeTnJzs0kdZYWFhTJo0yfOjXpYuxXbTTQD0nTMHli71bP4+SoO+h/n7+5OQkFD9U9WrtbVycnL4xz/+UWvbueee65K0nRUXF8eLL77Ie++9x3fffdeiNIqLi5k4cSJjxoxh5MiR3H///Y0ef+WVV/Lyyy/z4osv8u6777Yoz6NHjzJt2jRGjBjByJEjefbZZ1uUjlJt2alTp0hNTXVpr/2SkhL27t3r+Q6wS5fCggWkBgcTaAzd9u6FBQs08KNB3+M6d+7Mjh07qn9c9ZyrvqC/ceNGl6TdHJ9++imXXnopF110UYvODwoK4ptvvmHnzp3s2LGDVatWOfUF4qGHHuL3v/99g/sTExOZP39+vfsCAgJ48skn2bt3L9999x0vvPACe/fubVH5lWqrLBYLAMOHD3dZmocPH+b9998nNTXVZWk65Z57oLAQS/RQQow/BqCw0L69g9Og72VWq5VRo0ZVv37iiSdYsmRJ9b64uDh+/etfM3LkSC666CKKiooAePPNN4mPj2fMmDFcf/31LF68mIMHD5KQkMCiRYsA6Nq1a3W6Tz31FKNGjWLUqFE888wzTabfmGnTprF69WoA7r33Xm655ZbqfZdffjkrV67kvffea9H7YYypLndZWRllZWXVTY315Ssi3HXXXVxyySWMGzeuRXn27du3+tzQ0FDi4uI4fvx4i9JSqq2yWCyEh4cTERHhsjStViv+/v6eHyN/5AgHe/bn0+AEDlZG1tre0XWoIXu+oKioiISEBAAGDx7M008/3ejxBw4cYNmyZbz88stcc801fPjhh4wdO5aHHnqIjRs3EhERQVZWFrm5uezevZsdO3aclsbWrVt57bXX+P777xERzjrrLKZMmUKPHj3qTf+6664DYObMmbzyyiundYJ54IEHuO+++0hPT2f79u18+umngL02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VfDIyiTi+nbj6vEDq7fbbDadlKcRGvQ9qGqxnd27d9OzZ09eeOGFFqXjTNBftmwZZ555Jh991Nhkh81TUVHR7HNeeeUVRowY0eq8617zhAkTeO6551qdrlId0f79+wGIjY1t4sjmOXz4MEVFRR4ZufPaBivHsou499I4/P3sy29XLcetTfsN06DfkKVLIToa/Pzs/y5d6tLkzznnnOo120WERYsWMWrUKEaPHs27777b6PbFixezfv16EhIS6l2a9+DBg+Tn5/PQQw+xbNmPfSVff/11rrjiCqZOncqwYcOqp7K1Wq0MHz6cefPmERcXx9VXX01hoX1yi+joaO666y7GjRvH+++/z44dOzj77LOJj49n9uzZZGdnU15ezplnnlk9Fvbuu+/mwQcfBOwr723ZsgWArl27smjRIkaOHMmFF17Ipk2bmDp1KkOGDKlentdqtXL++eczbtw4xo0bx8aNG+u95sTERGbNmgVAVlYWV155JfHx8Zx99tn88MMPACxZsoQbb7yxOo+qLwkFBQVceumljBkzhlGjRlW/r0p1FCdPniQsLIzevXu7NN2UlBQCAwPdHnRP5pXwwppkLozrxaShEdXbAwMDuf3225k0aZJb82/TRKTd/cTExEhde/fuPW1bg/7zH5GQEBH48SckxL69Fbp06SIiIuXl5XL11VfLypUrRUTkgw8+kAsvvFDKy8slLS1NBg4cKDabrcHta9askUsvvbTBfB566CF58MEHpaKiQgYNGiRpaWkiIvLaa69Jnz59JCMjQwoLC2XkyJGyefNmSUlJEUC+/fZbERG54YYb5PHHHxcRkaioKHn00Uer0x49erQkJiaKiMif//xnue2220REZPfu3TJ8+HBZvXq1JCQkSEZGhoiITJkyRTZv3iwiIoB8/vnnIiJy5ZVXyowZM6S0tFR27NghY8aMERGRgoICKSoqEhGR/fv3y/jx40VETrvmmq8XLlwoS5YsERGRr7/+ujqt+++/X8455xwpLi6WkydPSs+ePaW0tFQ++OADuemmm6rTysnJce4GSjM/R162Zs0abxehw/Ple1BSUuLyNF944QV56623XJ5uXXd/9IOccfcKOZie1+SxvnwPXAnYIk7ER63p1+eee8BR061WWGjf3gpFRUUkJCTQp08fTpw4wYwZMwD7evdz587F39+f3r17M2XKFDZv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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "def newton_method(func, derivative, x0, tolerance=1e-6, max_iterations=2):\n", + " x_vals = [x0]\n", + " iteration = 0\n", + "\n", + " while iteration < max_iterations:\n", + " x_next = x_vals[-1] - func(x_vals[-1]) / derivative(x_vals[-1])\n", + " x_vals.append(x_next)\n", + "\n", + " if abs(x_vals[-1] - x_vals[-2]) < tolerance:\n", + " break\n", + "\n", + " iteration += 1\n", + "\n", + " return x_vals\n", + "\n", + "# Define the function and its derivative\n", + "def func(x):\n", + " return x**3 - 3*x**2 + 2\n", + "\n", + "def derivative(x):\n", + " tangent_modifier = 2.7\n", + " return tangent_modifier*(3*x**2 - 6*x)\n", + "\n", + "# Initial guess for the root and perform Newton's method\n", + "initial_guess = 4\n", + "root_approximations = newton_method(func, derivative, initial_guess)\n", + "\n", + "# Visualization\n", + "x_vals = np.linspace(1, 4, 100)\n", + "y_vals = func(x_vals)\n", + "\n", + "plt.figure(figsize=(8, 6))\n", + "plt.plot(x_vals, y_vals, label='Function: $x^3 - 3x^2 + 2$')\n", + "plt.scatter(root_approximations, [func(root) for root in root_approximations], c='red', label='Root Approximations')\n", + "\n", + "for i, root in enumerate(root_approximations):\n", + " # plt.annotate(f'Root {i+1}', xy=(root, func(root)), xytext=(root+0.4, func(root) + 4), arrowprops=dict(arrowstyle='->', lw=1.5))\n", + "\n", + " # Plotting tangent lines\n", + " tangent_x = np.linspace(root - 2, root + 2, 100)\n", + " tangent_y = func(root) + derivative(root) * (tangent_x - root)\n", + " plt.plot(tangent_x, tangent_y, linestyle='dashed', color='gray')\n", + "\n", + "plt.axhline(0, color='black', linewidth=0.5)\n", + "plt.axvline(0, color='black', linewidth=0.5)\n", + "plt.xlabel('x')\n", + "plt.ylabel('y')\n", + "plt.legend()\n", + "\n", + "# Set xlim and ylim based on the root approximations\n", + "plt.xlim(2, 4.3)\n", + "plt.ylim(min(y_vals) - 1, max(y_vals) + 1)\n", + "\n", + "\n", + "plt.title(\"Newton's Method Visualization with Tangents\")\n", + "plt.grid(True)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "%matplotlib inline\n", + "\n", + "mesh = IntervalMesh(40,0,1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 227, + "metadata": {}, + "outputs": [], + "source": [ + "# Define boundary conditions\n", + "\n", + "tol = 1E-14\n", + "\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]" + ] + }, + { + "cell_type": "code", + "execution_count": 228, + "metadata": {}, + "outputs": [], + "source": [ + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "\n", + "def Dq(u):\n", + " return m*(1+u)**(m-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Go to this link for derivation\n", + "\n", + "https://home.simula.no/~hpl/homepage/fenics-tutorial/release-1.0/webm/nonlinear.html#a-newton-method-at-the-pde-level" + ] + }, + { + "cell_type": "code", + "execution_count": 229, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variational problem for initial guess (q(u)=1, i.e., m=0)\n", + "u = TrialFunction(V)\n", + "v = TestFunction(V)\n", + "a = inner(nabla_grad(u), nabla_grad(v))*dx\n", + "f = Constant(0.0)\n", + "L = f*v*dx\n", + "u_k = Function(V)\n", + "solve(a == L, u_k, bcs)\n", + "\n", + "# Note that all Dirichlet conditions must be zero for\n", + "# the correction function in a Newton-type method\n", + "Gamma_0_du = DirichletBC(V, Constant(0.0), left_boundary)\n", + "Gamma_1_du = DirichletBC(V, Constant(0.0), right_boundary)\n", + "bcs_du = [Gamma_0_du, Gamma_1_du]" + ] + }, + { + "cell_type": "code", + "execution_count": 230, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iter = 1, absolute_error = 2.87e+00, relative_error = 7.71e-01\n", + "iter = 2, absolute_error = 9.00e-01, relative_error = 1.55e-01\n", + "iter = 3, absolute_error = 3.63e-01, relative_error = 7.10e-02\n", + "iter = 4, absolute_error = 6.46e-02, relative_error = 1.32e-02\n", + "iter = 5, absolute_error = 2.21e-03, relative_error = 4.53e-04\n", + "iter = 6, absolute_error = 2.98e-06, relative_error = 6.12e-07\n" + ] + } + ], + "source": [ + "\n", + "# Define variational problem for Newton iteration\n", + "du = TrialFunction(V) # u = u_k + omega*du\n", + "a = inner(q(u_k)*nabla_grad(du), nabla_grad(v))*dx + \\\n", + " inner(Dq(u_k)*du*nabla_grad(u_k), nabla_grad(v))*dx\n", + "L = -inner(q(u_k)*nabla_grad(u_k), nabla_grad(v))*dx\n", + "\n", + "# Newton iteration at the PDE level\n", + "du = Function(V)\n", + "u = Function(V) # u = u_k + omega*du\n", + "omega = 1.0 # relaxation parameter\n", + "absolute_error = 1.0\n", + "relative_error = 1.0\n", + "absolute_tolerance = 1.0E-5 # tolerance\n", + "relative_tolerance = 1.0E-5\n", + "iter = 0\n", + "maxiter = 25\n", + "# u_k must have right boundary conditions here\n", + "while (absolute_error > absolute_tolerance or relative_error > relative_tolerance) and iter < maxiter:\n", + " iter += 1\n", + " A, b = assemble_system(a, L, bcs_du)\n", + " solve(A, du.vector(), b)\n", + " diff = du.vector()[:]\n", + " absolute_error = numpy.linalg.norm(diff)\n", + " relative_error = absolute_error/numpy.linalg.norm(u_k.vector()[:])\n", + " u.vector()[:] = u_k.vector() + omega*du.vector()\n", + " print('iter ={0:3d}, absolute_error = {1:5.2e}, relative_error = {2:5.2e}'.format(\n", + " iter, absolute_error, relative_error))\n", + " u_k.assign(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 231, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 231, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max error:4.014e-12\n" + ] + } + ], + "source": [ + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/tutorials/3_non_linear_poisson_newton_manual_diff.ipynb b/jupyter_notebooks/day-2/tutorials/3_non_linear_poisson_newton_manual_diff.ipynb new file mode 100644 index 0000000..dac9828 --- /dev/null +++ b/jupyter_notebooks/day-2/tutorials/3_non_linear_poisson_newton_manual_diff.ipynb @@ -0,0 +1,228 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nonlinear Poisson equation \n", + "\n", + "$$-div(q(u)*\\Delta(u)) = 0,$$\n", + "$$u = 0\\text{ at }x=0, u=1\\text{ at }x=1$$\n", + "$$q(u) = (1+u)^m$$\n", + "\n", + "Solution method: Newton method\n", + "\n", + "Newton iteration is a more sophisticated method for solving nonlinear equations and systems. It is based on linearizing the original problem around an initial guess and then iteratively improving the solution by solving linear approximations of the problem.\n", + "\n", + "The Newton iteration can be written in the form:\n", + "\n", + "$$x_{n+1} = x_n - J^{-1}(x_n) * F(x_n)$$\n", + "\n", + "where $x_{n+1}$ is the updated solution at the (n+1)th iteration, $x_n$ is the solution at the nth iteration, $J^{-1}(x_n)$ is the inverse Jacobian matrix of the problem evaluated at $x_n$, and $F(x_n)$ is the residual vector of the problem evaluated at $x_n$.\n", + "\n", + "The Newton method is known for its quadratic convergence, which means that the number of correct digits in the solution roughly doubles with each iteration, making it faster than Picard iteration for problems where it converges. However, Newton's method may not converge if the initial guess is far from the true solution, or if the Jacobian matrix is ill-conditioned or singular at the current solution." + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "%matplotlib inline\n", + "\n", + "mesh = IntervalMesh(40,0,1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "# Define boundary conditions\n", + "\n", + "tol = 1E-14\n", + "\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [], + "source": [ + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m\n", + "\n", + "\n", + "def Dq(u):\n", + " return m*(1+u)**(m-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Newtons method require the evaluation of Jacobian. In this notebook we use manual differentiation for the evaluation of Jacobian.\n", + "\n", + "Manual differentiation involves calculating derivatives by hand, which can be error-prone and time-consuming for complex functions.\n", + "\n", + "$$F=q(u)\\nabla u \\cdot \\nabla v\\ \\mathrm{d}x$$\n", + "$$J = q(u)\\nabla \\delta u \\cdot \\nabla v\\ \\mathrm{d}x + q'(u)\\delta u\\nabla u \\cdot \\nabla v\\ \\mathrm{d}x$$\n", + "\n", + "Go to this link for derivation\n", + "https://home.simula.no/~hpl/homepage/fenics-tutorial/release-1.0/webm/nonlinear.html#a-newton-method-at-the-pde-level" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6, True)" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define variational problem\n", + "v = TestFunction(V)\n", + "du = TrialFunction(V)\n", + "u = Function(V) # most recently computed solution\n", + "F = inner(q(u)*nabla_grad(u), nabla_grad(v))*dx\n", + "\n", + "J = inner(q(u)*nabla_grad(du), nabla_grad(v))*dx + \\\n", + " inner(Dq(u)*du*nabla_grad(u), nabla_grad(v))*dx" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-5\n", + "prm['newton_solver']['relative_tolerance'] = 1E-5\n", + "prm['newton_solver']['maximum_iterations'] = 25\n", + "\n", + "solver.solve()" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max error:1.559e-06\n" + ] + } + ], + "source": [ + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-2/tutorials/4_non_linear_poisson_newton_auto_diff.ipynb b/jupyter_notebooks/day-2/tutorials/4_non_linear_poisson_newton_auto_diff.ipynb new file mode 100644 index 0000000..e7c3e7f --- /dev/null +++ b/jupyter_notebooks/day-2/tutorials/4_non_linear_poisson_newton_auto_diff.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nonlinear Poisson equation \n", + "\n", + "$$-div(q(u)*\\Delta(u)) = 0,$$\n", + "$$u = 0\\text{ at }x=0, u=1\\text{ at }x=1$$\n", + "$$q(u) = (1+u)^m$$\n", + "\n", + "Solution method: Newton iteration (Automatic Differentation).\n", + "\n", + "As opposed to manual differentiation, automatic differentiation is a more efficient and accurate way to compute derivatives of functions numerically, making it a popular choice in modern machine learning and optimization applications. " + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "import numpy\n", + "%matplotlib inline\n", + "\n", + "mesh = IntervalMesh(40,0,1)\n", + "V = FunctionSpace(mesh, 'Lagrange', 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [], + "source": [ + "# Define boundary conditions\n", + "\n", + "tol = 1E-14\n", + "\n", + "\n", + "left_boundary = CompiledSubDomain(\"on_boundary && near(x[0],0)\")\n", + "right_boundary = CompiledSubDomain(\"on_boundary && near(x[0],1)\")\n", + "\n", + "\n", + "bc_0 = DirichletBC(V, Constant(0.0), left_boundary)\n", + "bc_1 = DirichletBC(V, Constant(1.0), right_boundary)\n", + "bcs = [bc_0, bc_1]" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [], + "source": [ + "m = 5\n", + "\n", + "\n", + "def q(u):\n", + " return (1+u)**m" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variational problem\n", + "v = TestFunction(V)\n", + "du = TrialFunction(V)\n", + "u = Function(V) # most recently computed solution\n", + "F = inner(q(u)*nabla_grad(u), nabla_grad(v))*dx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "FEniCS provides a high-level interface for expressing and solving PDEs and has built-in capabilities for automatic differentiation (AD).\n", + "\n", + "In FEniCS, AD is used to efficiently compute the derivatives of the weak forms of PDEs with respect to the unknowns (e.g., displacement, velocity, pressure, etc.) in the problem. This allows for the automatic construction of the Jacobian matrix and the right-hand side (RHS) vector, which are essential for solving the nonlinear systems arising from finite element discretizations.\n", + "\n", + "By leveraging AD, FEniCS can handle complex PDE problems with ease, as it relieves the user from having to derive and implement the derivatives manually, which can be a tedious and error-prone process, especially for intricate problems." + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [], + "source": [ + "J = derivative(F, u, du)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6, True)" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-5\n", + "prm['newton_solver']['relative_tolerance'] = 1E-5\n", + "prm['newton_solver']['maximum_iterations'] = 25\n", + "\n", + "solver.solve()" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max error:1.559e-06\n" + ] + } + ], + "source": [ + "# Find max error\n", + "u_exact = Expression(\n", + " 'pow((pow(2, m+1)-1)*x[0] + 1, 1.0/(m+1)) - 1', m=m, degree=1)\n", + "u_e = interpolate(u_exact, V)\n", + "diff = numpy.abs(u_e.vector()[:] - u.vector()[:]).max()\n", + "print('Max error:{0:5.3e}'.format(diff))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-3/exercises/1_3d_uniaxial.ipynb b/jupyter_notebooks/day-3/exercises/1_3d_uniaxial.ipynb new file mode 100644 index 0000000..baf5e60 --- /dev/null +++ b/jupyter_notebooks/day-3/exercises/1_3d_uniaxial.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3D Uniaxial bar\n", + "\n", + "The objective of this exercise is to implement a 3D finite element analysis (FEA) program using FEniCS. You are required to create a FEniCS code that performs the analysis, solve for the displacements and stresses in the bar, and visualize the results.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Materials:\n", + "- Steel material properties:\n", + " - Young's Modulus (E): 200 GPa\n", + " - Poisson's Ratio (ν): 0.3\n", + " - Density (ρ): 7850 kg/m^3\n", + "\n", + "Bar Dimensions:\n", + "- Length (Lx): 1 meter\n", + "- Ly and Lz: 0.02 meters (20 mm)\n", + "\n", + "Boundary Conditions:\n", + "- One end of the bar is fixed (fixed boundary condition).\n", + "- The other end is subjected to a uniaxial tensile load:\n", + " - Load (F): 10,000 N\n", + "\n", + "Mesh:\n", + "- Use a simple 3D mesh for the bar, consisting of tetrahedral elements." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "---\n", + "Steps:\n", + "\n", + "1. Import FEniCS and Necessary Libraries\n", + "2. Define the Geometry and Mesh\n", + "3. Define the Material Properties\n", + "4. Define the Boundary Conditions\n", + "5. Define the Finite Element Function Space\n", + "6. Formulate the Governing Equations.\n", + "7. Solve the System\n", + "8. Calculate Stress\n", + "9. Post-Processing and Visualization:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = BoxMesh(Point(0,0,0), Point(1,1,1),3,3,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " FEniCS/DOLFIN X3DOM plot\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
Menu Options\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + " \n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 199, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mesh" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-3/exercises/2_plane_stress_strain.ipynb b/jupyter_notebooks/day-3/exercises/2_plane_stress_strain.ipynb new file mode 100644 index 0000000..ea812b6 --- /dev/null +++ b/jupyter_notebooks/day-3/exercises/2_plane_stress_strain.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plane stress v/s plane strain\n", + "\n", + "The objective of this exercise is to implement a finite element analysis (FEA) program using FEniCS to simulate the behavior of a beam under bending, considering both plane stress and plane strain conditions. You will write a FEniCS code to perform the analysis for both cases and compare the results with a 3D analysis of the same beam." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1m0.45m0.3m" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Materials:\n", + "- Steel material properties:\n", + " - Young's Modulus (E): 200 GPa\n", + " - Poisson's Ratio (ν): 0.3\n", + " - Density (ρ): 7850 kg/m^3\n", + "\n", + "Bar Dimensions:\n", + "- Length (Lx): 1 meter\n", + "- Ly : 0.3 meter \n", + "- Lz : 0.45 meter\n", + "\n", + "Boundary Conditions:\n", + "- One end of the beam is fixed (fixed boundary condition).\n", + "- The other end is subjected to a uniaxial downward load:\n", + " - Load (F): 10,000 N\n", + "\n", + "Mesh:\n", + "- For 3D analysis use a simple 3D mesh for the beam, consisting of tetrahedral elements.\n", + "- For 2D analysis use a simple 2D mesh for the beam, consisting of triangular elements." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Steps:\n", + "- Perform 3D analysis\n", + " 1. Import FEniCS and Necessary Libraries\n", + " 2. Define the 3D Geometry and Mesh\n", + " 3. Define the Material Properties\n", + " 4. Define the Boundary Conditions\n", + " 5. Define the Finite Element Function Space\n", + " 6. Formulate the Governing Equations\n", + " 7. Solve the System\n", + "- Perform 2D plane stress analysis\n", + " 1. Define the 2D Geometry and Mesh\n", + " 2. Define the Material Properties\n", + " 3. Define the Boundary Conditions\n", + " 4. Define the Finite Element Function Space\n", + " 5. Formulate the Governing Equations\n", + " 6. Solve the System\n", + "- Perform 2D plane strain analysis\n", + " 1. Define the 2D Geometry and Mesh\n", + " 2. Define the Material Properties\n", + " 3. Define the Boundary Conditions\n", + " 4. Define the Finite Element Function Space\n", + " 5. Formulate the Governing Equations\n", + " 6. Solve the System\n", + "- Compare the results of plane stress, plane strain and 3D analysis with analytical solution.\n", + "- See what happens to the solution when you increase the mesh density" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [], + "source": [ + "sim_types = [\"3d\",\"plane_stress\", \"plane_strain\"]\n", + "sim_type = sim_types[0]\n", + "\n", + "E0, nu = 2e11, 0.3\n", + "mu = E0 / (2 * (1 + nu))\n", + "lmbda = E0 * nu / ((1 + nu) * (1 - 2 * nu))\n", + "\n", + "if sim_type == \"plane_stress\":\n", + " lmbda = 2 * mu * lmbda / (lmbda + 2 * mu)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-3/exercises/3_solver_design.ipynb b/jupyter_notebooks/day-3/exercises/3_solver_design.ipynb new file mode 100644 index 0000000..096e10c --- /dev/null +++ b/jupyter_notebooks/day-3/exercises/3_solver_design.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solver design\n", + "\n", + "The success of tackling complex problems often relies on the effectiveness of the solver employed. While formulating the mathematical model is crucial, paying attention to the design of an efficient and accurate solver is equally vital, as it directly impacts the quality and reliability of the results you obtain.\n", + "\n", + "In this exercise you will study the impact of different solver parameters on the solution." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "\n", + "def elasticity_problem(num_ele_along_depth=30):\n", + " length, depth = 3, .300\n", + " ele_size = depth/num_ele_along_depth\n", + " mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))\n", + " U = VectorFunctionSpace(mesh, 'CG', 1)\n", + " dim = mesh.topology().dim()\n", + " clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + " bc = DirichletBC(U, Constant((0,)*dim), clamped_boundary)\n", + " E, nu = 2e11, 0.3\n", + " rho, g = 7800, 9.81\n", + " lmbda = (E * nu) / ((1 + nu) * (1 - 2 * nu))\n", + " mu = E / (2 * (1 + nu))\n", + "\n", + "\n", + " def epsilon(u):\n", + " return 0.5*(grad(u) + grad(u).T)\n", + "\n", + "\n", + " def sigma(u):\n", + " return lmbda*tr(epsilon(u))*Identity(dim) + 2*mu*epsilon(u)\n", + "\n", + "\n", + " # Define variational problem\n", + " u, v = TrialFunction(U), TestFunction(U)\n", + " f = Constant((0, -rho*g))\n", + " a = inner(sigma(u), epsilon(v))*dx\n", + " L = dot(f, v)*dx\n", + "\n", + " u = Function(U)\n", + " print(\"Number of degree's of freedom {}\".format(U.dim()))\n", + " problem = LinearVariationalProblem(a, L, u, bc)\n", + " return problem, u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "https://hplgit.github.io/fenics-tutorial/pub/html/._ftut1017.html\n", + "|Solver | Description | | | Preconditioner |Description |\n", + "| -- |--|--|--|--|--|\n", + "| bicgstab | Biconjugate gradient stabilized method| | | amg | Algebraic multigrid|\n", + "| cg | Conjugate gradient method| | | default | default preconditioner|\n", + "| default | default linear solver| | | hypre_amg | Hypre algebraic multigrid (BoomerAMG)|\n", + "| gmres | Generalized minimal residual method| | | hypre_euclid | Hypre parallel incomplete LU factorization|\n", + "| minres | Minimal residual method| | | hypre_parasails | Hypre parallel sparse approximate inverse|\n", + "| mumps | MUMPS (MUltifrontal Massively Parallel Sparse direct Solver)| | | icc | Incomplete Cholesky factorization|\n", + "| petsc | PETSc built in LU solver| | | ilu | Incomplete LU factorization|\n", + "| richardson | Richardson method| | | jacobi | Jacobi iteration|\n", + "| superlu | SuperLU| | | none | No preconditioner|\n", + "| tfqmr | Transpose-free quasi-minimal residual method| | | petsc_amg | PETSc algebraic multigrid|\n", + "| umfpack | UMFPACK (Unsymmetric MultiFrontal sparse LU factorization)| | | sor | Successive over-relaxation|\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of degree's of freedom 18662\n", + "The minimum displacement is: -4.712e-04 m\n" + ] + } + ], + "source": [ + "problem, u = elasticity_problem(num_ele_along_depth=30)\n", + "solver = LinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['linear_solver'] = 'cg'\n", + "prm['preconditioner'] = 'ilu'\n", + "prm['krylov_solver']['absolute_tolerance'] = 1E-9\n", + "prm['krylov_solver']['relative_tolerance'] = 1E-9\n", + "prm['krylov_solver']['maximum_iterations'] = 1000\n", + "\n", + "solver.solve()\n", + "print(\"The minimum displacement is: {0:6.3e} m\".format(u.vector().min()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The minimum displacement is: -4.71e-04 m\n", + "- For each parameter variation, record the solver parameters used and the corresponding solution time and differnce in the minimum displacement.\n", + "- Compare the results obtained with different solver parameters.\n", + "- Analyze how the solution time and accuracy are affected by varying the solver parameters.\n", + "- Based on your observations, discuss which solver parameter(s) seem to have the most significant impact on solution accuracy and computational time.\n", + "- Consider the trade-offs between accuracy and computation time when choosing different solver configurations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Task 1: Considering `num_ele_along_depth=30`, change the tolerance to 1E-5. What difference do you observe in the solution?\n", + "2. Task 2: Now change the preconditioner to `hypre_euclid`. What happens to the solution?\n", + "3. Task 3: Change the preconditioner to `none` and see what happens\n", + "4. Task 4: Change the solver to `mumps` and see what happens" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-3/tutorials/1_beam_bending.ipynb b/jupyter_notebooks/day-3/tutorials/1_beam_bending.ipynb new file mode 100644 index 0000000..e78f6b9 --- /dev/null +++ b/jupyter_notebooks/day-3/tutorials/1_beam_bending.ipynb @@ -0,0 +1,440 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear Elasticity\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Linear elasticity is a fundamental theory in mechanics that describes the deformation of solid materials under the influence of external forces. It assumes that the deformation is small and that the relationship between stress and strain is linear. The theory is widely used in various engineering applications, such as structural analysis and material design. FEniCS provides a flexible and efficient platform for implementing finite element methods, making it an excellent choice for solving problems in linear elasticity.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [], + "source": [ + "length, depth = 3, .300\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Different spaces in FEniCS\n", + "\n", + "In FEniCS, a \"space\" is a mathematical construct that contains functions used to approximate the quantities of interest (e.g. displacement, strain, stress, force etc). Different types of function spaces are used depending on the nature of the problem and the type of field variable sought.\n", + "\n", + "| Quantity | Type | Function Space | Dimension |\n", + "| -------------------- | ------------------- | ------------------- | --------- |\n", + "| Displacement (**u**) | Vector | VectorFunctionSpace | 2D/3D |\n", + "| Stress | Second-order tensor | TensorFunctionSpace | 2D/3D |\n", + "| Strain | Second-order tensor | TensorFunctionSpace | 2D/3D |\n", + "| Von Mises Stress | Scalar | FunctionSpace | 1D |\n", + "| Body Force | Vector | VectorFunctionSpace | 2D/3D |\n", + "| Surface Force | Vector | VectorFunctionSpace | 2D/3D |\n", + "| Surface Traction | Second-order tensor | TensorFunctionSpace | 2D/3D |\n", + "\n", + "Note:\n", + "\n", + "- Von Mises stress is a scalar quantity and is represented using a scalar function space in FEniCS.\n", + "- The \"Dimension\" column still indicates the dimensionality of the problem (2D or 3D).\n", + "- The \"Type\" column specifies the mathematical nature of the quantity (e.g., vector, tensor, scalar).\n", + "- The \"Function Space\" column indicates the corresponding function space to represent the quantity in FEniCS.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": {}, + "outputs": [], + "source": [ + "V = FunctionSpace(mesh, 'CG', 1)\n", + "U = VectorFunctionSpace(mesh, 'CG', 1)\n", + "T0 = TensorFunctionSpace(mesh, 'DG', 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [], + "source": [ + "dim = mesh.topology().dim()" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [], + "source": [ + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "bc = DirichletBC(U, Constant((0,)*dim), clamped_boundary)" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": {}, + "outputs": [], + "source": [ + "E, nu = 2e11, 0.3\n", + "rho, g = 7800, 9.81" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{align}\n", + "\\sigma &= \\lambda\\,\\hbox{tr}\\,(\\varepsilon) I + 2\\mu\\varepsilon,\\\\\n", + "\\varepsilon &= \\frac{1}{2}\\left(\\nabla u + (\\nabla u)^{\\top}\\right),\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [], + "source": [ + "lmbda = (E * nu) / ((1 + nu) * (1 - 2 * nu))\n", + "mu = E / (2 * (1 + nu))\n", + "\n", + "\n", + "def epsilon(u):\n", + " return 0.5*(grad(u) + grad(u).T)\n", + "\n", + "\n", + "def sigma(u):\n", + " return lmbda*tr(epsilon(u))*Identity(dim) + 2*mu*epsilon(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variational problem\n", + "u, v = TrialFunction(U), TestFunction(U)" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": {}, + "outputs": [], + "source": [ + "f = Constant((0, -rho*g))" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": {}, + "outputs": [], + "source": [ + "a = inner(sigma(u), epsilon(v))*dx\n", + "L = dot(f, v)*dx\n", + "\n", + "# Compute solution\n", + "u = Function(U)\n", + "solve(a == L, u, bc)" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 190, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABB0AAAEpCAYAAADf1lqCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXucbFdV7/sbVbt3moQrV8QPBMhmAwFFHiJsiMrhJY9ke1COXgVEBZSYAxofhEcCAYRAICQhEQXRCBwR5YBwRKOSBAigiIjZURAJAiEPEwjgA72+LundNe8fVat61lzzMeZac66qrv59/8juXjXXnHOtqu70+K3fGEOMMSCEEEIIIYQQQggpzWjZGyCEEEIIIYQQQsh6QtGBEEIIIYQQQgghVaDoQAghhBBCCCGEkCpQdCCEEEIIIYQQQkgVKDoQQgghhBBCCCGkChQdCCGEEEIIIYQQUgWKDoQQQsgeQER+TURe0nOOR4nIzaX2RAghhJD1h6IDIYQQsgaIyA0i8l8i8m8i8i8i8uci8iwRGQGAMeZZxphXLHufq4SIfFhETl32PgghhJB1hqIDIYQQsj58nzHm/wJwNwDnATgTwJuXuyVCCCGE7GUoOhBCCCFrhjHmX40xlwJ4MoCni8j9ROQ3ReSVACAidxCRP5o5Iv5ZRD7SOCJmjokXisg1IvI1EflfIrLpW0dEzhKRL8zcFdeIyA84r/+UiHzGev1Bs+N3FpH/IyL/ICLXi8jPWee8TETeJSK/PTvvUyJy79mevioiN4nI463xtxORN4vILSLyRRF5pYiMZ689Q0T+TEQunF3L9SJyePbauQAeDuD1IvLvIvL6ku8BIYQQQqZQdCCEEELWFGPMXwK4GdPg2ua5s+PfDOCOAF4EwFiv/yiAkwHcE8C9Abw4sMQXZnPfDsDLAfy2iBwPACLywwBeBuBpAL4BwPcD+KeZuPGHAD4J4C4AHgPgF0TkZGve7wPwNgDfCOCvAVyB6d8sdwFwDoBft8b+JoCjAE4E8B0AHg/ATpk4CcBnAdwBwPkA3iwiYow5G8BHAJxujLmtMeb0wDUSQgghpAcUHQghhJD15ksAbu8c2wJwPIC7GWO2jDEfMcbYosPrjTE3GWP+GcC5AH7EN7Ex5l3GmC8ZYybGmHcC+DyAh85ePhXA+caYq8yUa40xNwJ4CIBvNsacY4y51RhzHYDfAPAUa+qPGGOuMMYcBfAuTMWR84wxWwDeAeCgiPzfInJHAN8L4BeMMf9hjPkqgIuduW40xvyGMWYbwFtn133HjPtHCCGEkB7sW/YGCCGEEFKVuwD4Z+fYBZi6EN4nIgBwiTHmPOv1m6yvbwRwZ9/EIvI0AGcAODg7dFtMHQUAcAKmTgiXuwG4s4j8i3VsjKnroOEr1tf/BeAfZ6JB832z1p0BbAC4ZXYdwPSBir3/LzdfGGP+czbutr7rIYQQQkh5KDoQQggha4qIPART0eHPME0zAAAYY/4N0xSL54rI/QB8UESuMsZcORtygjXNAUzdEu7cd8PUofAYAB8zxmyLyCcANNH/TZimZ7jcBOB6Y8y9el3czlxfB3CHmSsiF5MeQgghhJA+ML2CEEIIWTNE5BtE5AmYpiL8tjHmU87rTxCRE2X62P9fAWwDmFhDfkZE7ioitwdwNoB3epY5DtOg/R9mc/4EgPtZr78JwPNE5MEy5cSZUPGXAP5NRM4UkduIyHhW6PIhuddpjLkFwPsAvHZ2zSMRuaeIPFI5xVcA3CN3XUIIIYTooehACCGErA9/KCL/hqkD4GwAFwH4Cc+4ewH4AIB/B/AxAL9qjPmQ9frbMQ3mr8M0ReKV7gTGmGsAvHZ2/lcA3B/AR63X34VpPYi3A/g3AL8P4PazNIknAHgggOsB/COmAsXtOl7z0wDsB3ANgK8BeDemdRs0vA7AD806W/xyx/UJIYQQEkEW60YRQgghZC8jIjcAONUY84Fl74UQQgghux86HQghhBBCCCGEEFIFig6EEEIIIYQQQgipAtMrCCGEEEIIIYQQUgU6HQghhBBCCCGEEFKFfcveQIg73OEO5uDBg8veBiGEEEIIIYQQQhyuvvrqfzTGfHNq3MqKDgcPHsSRI0eWvQ1CCCGEEEIIIYQ4iMiNmnFMryCEEEIIIYQQQkgVKDoQQgghhBBCCCGkChQdCCGEEEIIIYQQUgWKDoQQQgghhBBCCKkCRQdCCCGEEEIIIYRUgaIDIYQQQgghhBBCqkDRgRBCCCGEEEIIIVUoIjqIyCki8lkRuVZEzvK8/iwR+ZSIfEJE/kxEvq3EuoQQQgghhBBCCFldeosOIjIG8AYAhwF8G4Af8YgKbzfG3N8Y80AA5wO4qO+6hBBCCCGEEEIIWW32FZjjoQCuNcZcBwAi8g4ATwRwTTPAGPP/WuOPA2AKrLuSPG70w53Pff/kXQV3QgghhBBCCCGELJcSosNdANxkfX8zgJPcQSLyMwDOALAfwPf4JhKR0wCcBgAHDhwosLXdxYJgIeXKbchININUc73v1rf33A0hhBBCCCGEkL1CCdFBhTHmDQDeICJPBfBiAE/3jLkEwCUAcOjQobV1Q+xmHr//qckxfUSOK/7rbblbIoQQQgghhBCyopQQHb4I4ATr+7vOjoV4B4A3FliXrCEn3+bHd75RiRfhMVf8+1sL7IgQQgghhBBCSFdKiA5XAbiXiNwdU7HhKQAWHoeLyL2MMZ+fffvfAXwehFTm5NvumGlkpEgfcQSMy//1LaW3RAghhBBCCCF7it6igzHmqIicDuAKAGMAbzHGfFpEzgFwxBhzKYDTReSxALYAfA2e1AqyHqhSK3YJp9zuJ9sHNeIFgMu/9qbCuyGEEEIIIYSQ3UeRmg7GmPcCeK9z7KXW1z9fYh1CdgUiOOX2P5UeNh4vfH/ZP/xarR0RQgghhBBCyFIYrJAkIctClVqxAhz+5me1D0acI5d9haVRCCGEEEIIIasNRQdClkGBNJTDd3z2bK60qHLZLW/ovR4hhBBCCCGE5ELRgZChGQkk0DK0Fofv8rO6gaMRLrvpdXU3QwghhBBCCNkzUHQgZEh2QaHNwyckSrBYXT4u+/tfqrwbQgghhBBCyG6GosOqYibpMcqn5WZiFFOVW29XIgOIAasuOHSofXH4wC/4XxgvznXZ9Rd12REhhBBCCCFkl0PRgRRFJ3BIWFRZR2Gjq9iw6iJFBofvfkb7oNu949oLBtoNIYQQQgghZCgoOpDVwhYjJgoBIjZkCPdCijUSDtR0vObDJz7fM5fjmPjcazrNTQghhBBCCFkOFB3IoMiQQbiZui7MJJ064m2r2Ve0WEfBIXVPKl/z4Xuf6X/BSue47DOvrroHQgghhBBCiB6KDmQwBhUcSmCcVBERQCFgYDweTnDoUIehGst6f536EYfv80LvMGPdq8s/fW7VLRFCCCGEEEKmUHQgg5AtOOz22g6J2hbGKdw5dAvN4tjv7yqktSQ45b5n+18Y7+z98r955UC7IYQQQgghZH2h6ECqs+scDl3p4TownsKaEqtpsSr3dFX2UYFTHvBi/wuz9/nyT5wz4G4IIYQQQgjZnVB0INXYM2IDsCM4DPWUv3FSSLpbSLU97aL311RIQznlgS+Nvk5RghBCCCGEEIoOpBJ7UnAYfN2Me6ypRSGiFyj6vr9Ou8x1w4wFJz/4F6Njrrj65QPthhBCCCGEkOVB0YHoaVIAEvUHBhMcVkHY2A2Cg2q+2XW4xTNddkG9ht3CyQ+Jiw5XXBUXLQghhBBCCNkNUHQg+SKBp/6ANRlMooji2rggugoOfa+/huCQKybE3mP7tuwmkWK8WnttRAnj2df7/iKe2kEIIYQQQsiqQNGBkC6sm8OhFiHnhCta+K5rldqBrhiP/87FehHGaRv6/o8GimASQgghhBAyMBQdCMlhXcQGYLWCep9zwi2SuQquiYHvmc/loOFxD2u3+2zm+sCfBtqFEkIIIYQQUgGKDmS9KR2opgoyFiqQKHbdjFVxN5QIuPu8Hz7XxGi0KFisSeqOyblPmff0sY84N/gaBQlCCCGEEFIaig6ElCRViBEAXN0iFiiviuBQgiE6YwRqTcjMNZEVzC+JXMHBFPyMPOZRrwq+duWHX1RsHUIIIYQQsneg6EDIsvEFyuPIa12DzCEEh9DeaggOHQQEiYhC85d6ChNdUyKADMFhCeJJI0i49SMA4INXnjX0dgghhBBCyC6BogPZ88gq1TbQ0AgRI9E5K0TWy+GQG3B7guQosXtqTJWAv2Y6xRB8z2POax1rxJcPve/MobdDCCGEEEJWiCKig4icAuB1mD6ffZMx5jzn9TMAnArgKIB/APCTxpgbS6xNyFpRqyZBqhZFl7aZKULziUcEqCU41CAp9Cj2aIlAQwgOfdwXXda313v0418THEdBghBCCCFk/ektOojIGMAbADwOwM0ArhKRS40x11jD/hrAIWPMf4rIswGcD+DJfdfe85hEIAn4A7zWNOmn5bImBfpWmtL3WCQvSE0F0/brqXlXJJ1CS7GgHGjX7HCxfiRXOZ1iiD086vD5wdc+fNkLiq9HCCGEEEKGp4TT4aEArjXGXAcAIvIOAE8EMBcdjDEfssb/BYAfK7Au2aXERI6VFTdqB301BIeaBAUK2Xk9tYcVERyKotnnBPN2oL4aE8ZNhRno2qMFKWuklCSEnkaQMM7t+JM/phhBCCGEELKbKCE63AXATdb3NwM4KTL+mQAu870gIqcBOA0ADhw4UGBrZFAUrooUjSAhI4WLYxJZb1XFCx+rLjh0nS8kTDTT2bUpQmuuktgQq4uRs8/Ej4nMUmHMvtnAHIdJaWqt12PaR/73tjvC7JtO+Kd/8PzuExNCCCGEkCoMWkhSRH4MwCEAj/S9boy5BMAlAHDo0CFFhTyyjhRxO8wD2vRQ46l30Km4ZKdzVkAgKBFM9wlOvd07LMdE3/lrU1BwSM7pE3KMNbbkbfLsoUh7zopv5SOeeIH3OMUIQgghhJDlUUJ0+CKAE6zv7zo7toCIPBbA2QAeaYz5eoF1yRqyKukVrhBRvMNFjetclsNhCEHAF2yLLNcFkLNmzscn4zpaqRghc8mknaZQag/6OfNPUe1Z8bP0iCdeEBRMPvKe52XuihBCCCGE5FBCdLgKwL1E5O6Yig1PAfBUe4CIfAeAXwdwijHmqwXWJGvIqggOLkUFhyaYs5/u973uKgGixL+vuXZXQukcNdwSgbm8hSFXJNiXSMbSPLhfwXSKKAV+Zzz8By6cfz0Z7xz/6LspRhBCCCGElKC36GCMOSoipwO4AtOWmW8xxnxaRM4BcMQYcymACwDcFsC7ZPpH7d8bY76/79pkPVhVsQHIEBwKpxeYSE0LsWtnLLN+wyoJDiHGdquISMbWZHYtmrd7yHSKvohu7rkTIuQoyaBVILKy4JDl4MjgYT90YfA1ChKEEEIIIXqK1HQwxrwXwHudYy+1vn5siXXI+rHnBQcfiXtiZq1SBeN0m8saIkJo3Kq9l12uJ1a/dJQxZ+yjo3WR9EU5bTJotz5j4nzcoi0/V9jd4MNo79dY8N1Pfq33tT9/53ML7ogQQgghZD0YtJAkITYUHLoj2k4hKVFiZ8Ky45ZNxvVEA2cXjcizIukUGhrBoWuBSG/LT8UGOhek7Hheaj2t4JDCFiOMlarxsbdTjCCEEELI3oWiA1kKFBy6MRcbSt8/rWPCmH7XPRqnx/ShhrMj176fckso1m+lKGjpIDhUo3T/oSU7HACoPzPG+Zh/11P9zgiKEYQQQgjZC1B0IOUwsWhrxixoNp46BllChPZJfyYqwWHV3Q36CbudFxQoliwk1XBrNLe8VDHRCaaVb4Ai9RMWz9UN6yw2JN0ChRwj7jwDiQ3R+1LpZ/6kH7/Ie/zjbzujynqEEEIIIcuAogNZGRohYhkuiFV2N0yX7RApRvPtl5RO4QpTvusaF77WLuOAfIdDCZpgfOLZp9sds/nMroC7IUtwSE42vQdzt0cjUBb8vVDD3ZDLJOJmscUI2zXxl79JMYIQQgghuw+KDmQ4KrkTgmQEKWayEwwHBYjdJDjEJyw7rg8+d4wbEZYQT3LGdrzdppQbIrRPV69pqjoaXY2EIQSHzmkhLr574OvyMpZpGkeO8LICgkPXGhIPfYbfGUExghBCCCGrDEUHMgxDCw49sAWIBhmN9EUZC1JdcFgxgcWL7743+25eS+23suBQjI73XTwBOQCYmWukhuBQ1N1g02VeRcZPCbGhxH3M2YdbGyLEoWf6xYgjb6YYQQghhJDlQ9GB1GeVBYdVCq4d1trhEFy7q82gQJ2JIT6mMSdARWFEIuVWugTSKyU4xDA77ot2u8+B9pBaz7uHMmvaYoTtQrn6kueUWYAQQgghRAFFB1KPVRYbMlhWcUnjST0oXttBM3YIESLnurT7sWtD5BQuHJpKdSbUwoBIKyDfmaPjnBG8Ikc1ESPykitCFFrS506oJTgY6SYaPfi0i73HKUYQQgghpAYUHUgd1kRwSDJwwNoIEQKl73qd3A016jfY42LNV6Rnq1DN+jOCgb3yNpV0IdiBuQEglnhTbJ0lCA4uC6JASKDqsM/s2g3ValPohj3o2X4x4q/eSDGCEEIIId2h6EDKsxcFh1JFBFXL5jzuVjy/LRH0dek4ASxdcFAFzs0WS9f0qJBOUSvtwVcgUnz3o6lt2VPs6l07oYZbwJhwpO85HBMFWoU/a4kNmXOHsMWIiaV3fuL1FCMIIYQQkoaiAynLXhQcap7TmqJGRcBEMF3tSXRhwWHJnSy8QbjFPBAvkU6R45DoQdcuC7F7YSCr527oi+dyJaJRLA7MWKaju0HT3aQLDzzd74ygGEEIIYQQG4oOpCy+Fog26yBK7LXWmRrs7gmhAGcedFeo31BDmGi2WagzhhgzDbh9AblvjiWkUyzOmzk+p12m9h7krFdZcFAF7u6WQrUyPGPb6znfL6EQZVe+/efaYsQnf5lCBCGEELJXoehASA61BQdPYLPSYoOPQPvGeeeGRpiKXVft+g0ptLc8w70QFQfsILwZZ+t3gf1E5+zxdLuoC2A+ZyrKtgtIZAgKueJIrY9/7ry+H5PMNI3ee7DXUZaJ6YpPiDBj4G8uphhBCCGErDsUHcgw0OHQcUnPfetjlV52pwYbnytmPIt8mgA0tt8lp1No5yziRHBv1ew2iTFFnQ61AvJmj51rNXTsiGq7E4YQGzSBe3QfmWkaC/dzhX60NTT36gHP8adoUIwghBBC1geKDqQ+6yA4AOULCSbYdQ6HGF2FEt89b4p2aoQJzevzefXb6iQ45KQfxHD2GaqfYBRRqJ2iUFtwqDN55DVbDFgBd0Mfx0I0TSNzH32YVHZD2DRihC2sfOq1FCIIIYSQ3QhFB1KXdREcUkwStSyAnaf4CnoLDm6gtyzBIUds6HrNQTGoYjqFgirBdqUfp6WkU4TOS31mtNMazD8bC60/nfk7uy86Cg7Frg/WdTk/Ar27f9RGeY3uddz/uX5XBMUIQgghZLWh6EDqsVcEhxpdAzypB52FiND+arf51AoONQpL2i08Yw4VkZUSHEzsPanYOtP3JL2PEFHN3VCgvoG4NUesvS6120Tm3NFprF8fk7HsiBIDaI9RwaNSfYr7vcAvRvzt+RQjCCGEkFWAogOpAwWHRQoE+I0QIVA6JkoEfl33XVpwqFC/YR7gp0wq44w5awXbS+hk0QgRZiSLT9JTdRQGEBySnTI6biGYxtDMN1A6RTWnQgFTUGcqCQ6xOhq2GNGM+/SrKUQQQgghQ0PRgZSHgsMOhd0EWW6HgWtQzNkFgkN2nYfUvRQZLp0isE6N9b2Bs88VsU+q7aFWsJrlXGk+0+61hwo8DtRxIkbOHswI6m4a2fg6cizBDdFw3xf6XREUIwghhJB6UHQgZdkLgsOA7obFZVf03jb3o0b9hhrtMHMEh4x5gwUduwbiFdMpdHPmnxO6B9P5ukzYfWx0/1mpMrEXrS9z/2/a8y2LBe7FRA83EyXSSSN77j5jM8druorc94UXY+K8h595BYUIQgghpAQUHUgSyQkmfW0Qdybqv5llsy6CQ40n0hMTFh6a9WrUb6ghTOTUeUjM2wTi4XqXnvP7plP0aauKSoGlKNIXcufMHQuUExxiSxRM08ihZg0JM2/Tqli7wD6C15I5d5/aJPd5id8VQTGCEEIIyaOI6CAipwB4HabZz28yxpznvP4IAL8E4AEAnmKMeXeJdUmCXRjkqwSOZV0XBYc0bpG+hiYH30zS798y0ymA4QtL+tSIRruLPs3uKSx46iLUeoqd2utCd4n5fxRr9EynCLkF6j3Nl+m1Vug24dtzsFNGBXFiXgNk/h/FuTVFksy5XZdDcN4x8K0va4sRf/cyChGEEEJIiN6ig4iMAbwBwOMA3AzgKhG51BhzjTXs7wE8A8Dz+q5HdilDCwUq8aKGJX+FBYdltc10CblhmpaiTRAe22+tdIrCc86Dbc3cvjl9t2r+xNkUTatYluBgM3GFkFgpjVr1G5ZQj0Gc9znXEbEKKQ9GAuJJieKVFd0NpdrF2kKEnc7x2ZdQjCCEEEJKOB0eCuBaY8x1ACAi7wDwRABz0cEYc8PstVSdeLKOKAJndQrHwOKFNCJCqu0iUFRw2FXuhhRdrf6+e26/H5prWgXBoeCcrdNCdSRM3pxhK7vnBXUgXDnQ1wSzBfZQzC2gZGLXH0hcYwmxIeiyqBW4x94/3zwxk5Cz91wBoZTgEONbXtF2RVCIIIQQstcoITrcBcBN1vc3Azipy0QichqA0wDgwIED/XdGls+qCg4lg3CN2JBTkHBdBIcahSVtQkLQOHOuodMpAnOawi4ZjVC2Cu6G3D0k22XaqRnuPQh2/sjbQw2y9tCYgdw0jRJ1EGoG7iE3xHwyzz6Mbk9DuBs0BSk1e/2WV1zsvQ+fO5tiBCGEkPVkpQpJGmMuAXAJABw6dGhJ/f5IMXa54CCFxYQks3thnPSDXiLEqgsONQpL2qQC78KCQ3V3QyLgVq8/tUJ4iwJ6A7LY02ZnT9UdDn1ofR4yJw25BTTBaIRSgXtLhMjdSM3Avc97HbmQ5D56uiGy6Dn3vc9tuyIoRBBCCFkHSogOXwRwgvX9XWfHyF5mFwsOKrFBOVcJbBFCxhnRzboIDhUC+bmrIJXwta+CuwGo8t6UWn+hqKNrhY+JDyskNqgKM1r7XVa3iYU1NHQVBVKpKCnzSJ/AvcPYnPm1bo+hxIYSRUHnc42Be53XFiI+fxaFCEIIIbuLEqLDVQDuJSJ3x1RseAqApxaYl+xWKDjk07PF4QLN3mJP+XPEixx2geCgHjeW+D205uqSTlGShfVjS/QVBrr6z+ygbAVSGdRuJ+PpxjB/MW9JtzZEzfswLeqoyUlw/k2sN6i7oePYLm6PXk6VJWi7thBhxjtXeO3zzxh+M4QQQoiC3qKDMeaoiJwO4ApM66q/xRjzaRE5B8ARY8ylIvIQAO8B8I0Avk9EXm6MuW/ftckKUkpwWEJdg6UIDsogvXidBw25NQaWJTgss5PFbL5gQccFMWB13Q3tefP3EroH0/kacSZnwvw96Oad7UXxHkf3awJfF64/sJSUhw7i0sL9HECcyH3/1KlEmfvoQnLvHec+8YKLWscoRBBCCFkFitR0MMa8F8B7nWMvtb6+CtO0C7Ku7GJ3w3TJPSQ4lLyGrKC3Qv2GGsJEwToPTSBu4HFN9Hwf+ggOsWKM6kCskzARXmv+ZH7J7gagZzDao/5AKxitJThkBO5IBO6ttWsKS4XvhwScHr5zF9wQA6VqlODECy5qOTm+cAaFCEIIIcOyUoUkSUEKBapqoaAkJpFoX/hJOQWHHuNsJoluEmaSfu+WmU4B1OlkEQrwU6kbsTkrXHsr0IqdW+hHYaF+hPtFyV89He+DKkUhZxsFCneqzo9uovzYeRoKEH3/OrshOqSXAFD9PPvun/d96rCPbBY+e/GhfYSxe17UdkQAFCMIIYTUg6LDOrKbBYeSJII6dVHGJdVv2FWCg5aQoNS8F8bo1i99LTm3ukInC1OjxsYKFXbstL7vxzfVLtNlAHdD3zaKQeElpFVZn9Wq71vHNIadg2X3oSH3PcxuU+q7Jvv96Poru+K+tWPNPoN7/PJrW8ev+7nn6hcjhBBCAlB0WDfWXXDQXF+Nooyl2GuCQ5f3IiQW5daYqFS/QUPtThbR+gmZ96lPOkUsTaP4+s02tOkLQ6VTxOgTHCaMMLU7SGjodN8SYkTXjiGdA/G+tT1sHbXL3vvc71H8Q1Lic+0KEWYEXH86hQhCCCF5UHRYJyg4ZBQzXM1rXBuxAShfWNImFHQ3qRy7QXDIvefaAF/dcSNj7Uo/LqX3IAaYNM4D+z5E7vUQgkMqTaNb4U7FHAO5CooURnTTMiJuj9A+NNRwCbRPDByXwNeF91LrnjTv891f33ZEUIgghBASg6LDurDOgoP22lRdMZZ8faG6B8hI99CyG9wNNVpnAtHAe+4EKCw41HY3qNZXBXfTaK5GfQHvcp7Pw+DdG5zPQ+PQqCI41LT4K9M0Jo1ApQzcl7Xn5FitK0JB1dQL7VgzC9ztVI3CtRvabohyc8ewhQi7jecNz35euUUIIYTsWig6rAMUHFZXcFA/cS+8t1UXHJbZyaIhVq+0Cdp2k+BQYP2F+gKZT5y1eDsDhD43lZ9Kq1M11BPqh7rzR90Cfe5/6ql7zXtc2g3hzOX9vPrG97zGYu+Nb6zv91BTe3dVRJWceceLH7iDb7ywNYZCBCGE7D0oOux2KDhQcOi67qoLDsvuZAHEUxXmaQrLTenJXV9ThyG3voCWwR0O3nn190vtBgEq7rfOvPNA2r7GQoH7MtpmttJNmtq0K/C+5I73iSpAeH+9r3Fc6AdcycE3Xtha84bTnj/oHgghhAwLRYfdyjqLDcBqCA6a80JF+zIFB1UtB8215hQRVOb+q1iW4FBDmMhMu/AVdWwJASvsbmjPqxw/dDDXO00j8x6EpnEDwYwt9G1vGXviXuQeu9c2SwXI6srQYx/Ra+j6a1whHJVoOxq8RwXFiQVnxyxoH6RGxQBzH7zkgtYxChGEELI+UHQgaUoXNyyxXs/QZymPAAAgAElEQVSCkZLbCSGHZTgcsgQCzf0tKPo0LEtwyLo3ynGJORshwuyr8zmrITjUfMpbo37EMgQHl4n9f9CC9QeGSnlQnxJIRVoItGvuo/D9aD6PjRti/n3q3BW5xoXTlD9bKyM4CJJdNxru9ubzvcdvfOYLMhYkhBCyClB02I2ss8shdW1ZQe4eSakofZ3a+cYa8SKzOOYaCA4NWmEgv8Vl+WvvEhDr0jTCYxae2tpfJKaN5u67t7LSPci6X7OL01rl+wbYJepjaJHJNHAXuzAiCtenqOT28I2NBvAFBIShUnN8P1ti+gkPvvs+hODlwxYjZN/0Cm94+pllJieEEFIFig67jV0qOKjWK+WoWFaHClU6xpIEgtLzlVw3956U3mOWdbys4KBG2y6zoUawnRUYifqcnPoRJdwNfYOnXIEmJAL0SdPoso8qhPQNjzPC5DbnydxzrffQW/sCCO+v4vuSXSzSuedZNUpK7qWDOGGUboiGg299TesYhQhCCFkdKDrsJnah4KBea+gUjpKsesHI0vPVFHVCdSYaN8CyBIesIL7uz5evhsR87QzXRD27fyWHBfxBk3eeVXA45KRp2MHhAGkaWTUaMuf2rjdWpmh0mds3tqIbYudFz7ES701AnKn1ORUDGPeESFuX6Nw+oWCJKSlzIcLa1w0/flbmhgghhJSAosNugYLD6pIqyKhJQ8hlHQUHDbF7Pc4UJnaL4KDcpxlJ/P5Ye1u24GCvH0wHyFh/npM/n7TJaQifHC9auPhizae66rkrpmlkUzAAtsWIuQChnH9VWkrOhYJUe9LQ94X2kTveCPy/X7x5O6ZeQdGO46VD142DbzuvdYxCBCGE1Ieiw26AgsPw9OlcUZuSge1uEBsKtrk0o1E6iLfXW1Y6BZCV9qFa35h5YUtV4LoK7oa+wZn3s5D3Xq1EAUgJuxNaD6WbIqY9P5NVHAgRJvZ6AVdE8zNRJBAP3M8qdQrmhRWs77ukHjV4HAU1xYnmQ+ZNm8n9nPR1Q1R4fw6+7TyMxosXd91TX5S5ECGEkBgUHVYdCg7Don5KXrgTw9Bz5cy3GwSHnD2GApqG5qllbM4F18AuEByA6PUsFJ5rfn7dQKnv+ugRwCd+p3TJS9ekakSLVro2+BVI07DnlYn/ApPOksL7KDkWk+k+WqJZIQGhqqPF3WOp2iWZ4/NFFRNvIetzqqjnrji+GRtJFYlxj7e/ynucYgQhhHSDosMqQ8FhWFZZcFhWPYhVLsqZO7aUY2JFBIcabTP9C/XfwxBBdjLgUe7VrvK/IMYUSGOoWe3fiG68TIz/fetwfcMX5Qy85AiJZlRmH8HPVM0n86aQqNK320RusG7PrTEYRT9XzgSVUzVEea0yNrjnO89tHf/Ck8/OW5AQQvYgFB1WkV0oNqjXW0WxASgrOJQORCk49BuXM1bz8TRGV7Axt+NEDXcDkJEikrH+vungUFFLsyDM6Oet5xbo78bo0m3CdhWsxH1A5LPTMxOl7tP2/LHaoqO1uzDkjFWLKiJZ3R26uBvyxgMmVV+hlQa0c25q7px95NCIDZLZKcPFFiLG+6Zv1uf+n5f0mpMQQtYNig6kN7va3QDsLcEhpw5FqkBmjUp1pQWHnPejQmHJFHPxYuB0ivac+vV1hR3NPOAuXfiwj9gQc0N0DpoVxQOjaRrunqoF+uJfz0czr7IwYs4T9+qtFhOtOd2io7azpcte+ta+yB7fiCoT/0muGJHlhujjbug6Xlt8033ZFTkquRu6zA0A9/4/r2gdoxBBCNnLUHQgcUoJBZp5VE4JUQTDGayT4BBbX9tycpkuiD0mOCzQPMn0BjCzYLFSOkWNIDC216BjQFFcbxB3Q+K83G4TQPk0jax9IPezo5nQOaUJ5Iu+f5XG+k4PuSK6zF1bVEn8rmrEiEZ80IsqFQWHZmyOo8AdGlsv61djt+vs64YAdoSI8WjHuvKZH/jF3vMSQshugKIDCaMQCoZO4ZguGl9TEgKBmUxU8wAYpH6D+O6ze1/7BLulr0FEJ4iMEo8cgfx2oqUFh6wWcAN81n1FLhW3ceGP7qXXWdAPnrgpKEpLfJJKokuJe9YtTaPbHrJrjkh7vdTYhUOeiwk8kF+gdU2VBYeUG2JxsHK9lRInTOxbANY9TwThvd6b3PGxsb70jGQdF+c+VHQ3ZIsZM+7znpe3jlGIIISsIxQdiJ9VFRwKIKPRcIJD7j1aVjrFMl0GKTTXYN+30oLDMl0d9imxVqAi6Sf0VoC/CoKDeg9jUefnDyU2RIPWrh+XnmkarelKuxu6jEXEReCbZ0B3Q4zofe4QWy46aTJPzrons3apClFFzOxSFlqeJC6usosD8BSRjOETaT2/17u6G9TDZ/OPUnUtlHu5z3tejn1OC89PfX9bnCCEkN1EEdFBRE4B8DpMn8m9yRhznvP6MQB+C8CDAfwTgCcbY24osTapwBoLDkVZdjpFcr4VFxxKXq9izYUgbLcIDhX2GQ2o3HkKpFNkrd/aT+JlO20BWEy9iuxpaHdDr3m1aRpN0NbR3ZA7NuWGSF2f91oiKTYL6w0gOGS7PXp2bEiemxyfF1h73x/fQTHptKc+9RVKizB2rK4RX2yRo7K7oasbAgDuf2nb/UAhghCym+gtOojIGMAbADwOwM0ArhKRS40x11jDngnga8aYE0XkKQBeA+DJfdcmFaDgMCWn4GLvtSrcz3URHIoLOxnrLVNwqNXJAonAdT6ozvq1AviJL7jwOkNkMMHBRD7jVdI0aj5Bzxw/34vic9zadyp4r/S/nyr3z+3QUEtUyQhmc96bnZN8ayqPxeg4XlVfwRbIAm/ugghQUXCwx44U52nnftB7X9w69lff+0r1vgghZEhKOB0eCuBaY8x1ACAi7wDwRAC26PBEAC+bff1uAK8XETGmZEVA0pu9IjiUCCZV6RlLulcli15WKdq4JAGjUP2GTu0ya7gboA/4g6343MBVEyQupGko11+2WwA7+9bY/Vdhv12D61gb0/n7uwrXlzPeBL52hZ6cWg1d9uGs2an2ReyvnmW4G7rO7XtPYvP3cBTUGm+MQJrNR67BFjlquxv6uCEAChGEkNWlhOhwFwA3Wd/fDOCk0BhjzFER+VcA3wTgH+1BInIagNMA4MCBAwW2RtTsFcGhL4UDYW8Rya7sRXeDcs4abSbVBOb07kn5Fma5CyqYdpLrr1wAnx5sd2Ao3eYzNEfwvalwH8QYmHkOhnKtWgJQ7ucjNMZXXDCZChDeS+d9lBqfKFq56Ibo4G7Q0tSGyH1vNDUWat5De6zCDeEN8COndXU35I4fd927h32jCR56+Yu8r/3lKa/SbY4QQgqwUoUkjTGXALgEAA4dOrQrXRDvn7xr2VuI8viNp7QPrpHgkOpc0W/yJQgONYLlmMGomWfVBYeMz+MqCg4tgsFn+/wagkNuUJIsaqmYt5V+UCPAzU39CIzv0nGiNbeWWKDZY97g58a9tiYoH0BwSNLlR1JRkDN7H7l7qSWqAMt1N7TGK8a47YAjjgIzkBuiq5vATtNw57CLSNZ0N/R1QtjYYsTGeBsA8NHHvabY/IQQYlNCdPgigBOs7+86O+Ybc7OI7ANwO0wLSpKBed/WOwZb6+TNHx1sreoUDIbV7oZlOBKMKe+YWJLgkFe9v5IwoSls2DedwnM/ctwN2cFXAjEGkxyRconuhi7zTuz/ayYC3JVweaBDcUlAlcdfLZ3CWSv5edbMaxb/FROet199hUpjG0I30elc0dXdoBtrbSezvsLOiZnjS4zFYtCeWxvCplUnwhjdfIG95I53u1v0mbsRHADgYe8/s/U6hQhCSAlKiA5XAbiXiNwdU3HhKQCe6oy5FMDTAXwMwA8B+CDrOaw/V/x/v1NsrpOPe1qxubLZK4JD6XFZgecaCQ6ht9j9ldfMN4mc05za190QTPFQT6tfP1uYQThwsN7vVRAccmsQDJWmEQyMSrfNbFJQZoGtnZISPa1mIN5jbgnEbbVrX7jjy4gqjdI1fVNiosri3HXbSfZ2q7jvWUc3RO22mQBgJu2TQkLEUKkaJWiEiP3jo/NjH/qe1xZdgxCy/vQWHWY1Gk4HcAWmDYreYoz5tIicA+CIMeZSAG8G8DYRuRbAP2MqTBCi5or/+K3ec5zyDT+Rf9JeERxyrlMzdqyo6JabCrPM+g0Vuk4sEAp+9uX95dsrnaJAClWnJ+pA9KlnMqBdeCq9ZLEBAMSTOtK8NGCaRnHBITLWmxrf5Yl7j7FFAneXCrUv6ooqi2+ET1QxI+z8nurobsge77bUzJlf2zkjNnUPwSHlXkjNbQsR45k7YVUEB00njQZbcACAR3/wua0xFCIIITFkVQ0Hhw4dMkeOHFn2NgjBKbf/qfCLJeo32HN0DZh9AXyXuWLnNPtMFhEc6e6LtstGaq6FGgKBsa1iZiGLsvtYrT1OtUbsHs1e0wSFZp/iHo1EEXApHANaUcftzIH2tai6YCjW04guO0+l42PtPYUdB75rc76P6WnNw2bNtYkuUDYjReBuPzUPuVqURSujexLFmGaewH1q3c/m+8g1ttbzjC1yfbPx3has7nrK2hcL1xtypHjdSYoxC+ONbhwA43vc5AlAde+N529Id3xMdFhwfCgKKIbmcteczRULwluCgk9Qi+xpoRWmYu/jSEqEW0gyJR646RW+8ePIHKOF9dKpGhuj7eiYhv3jxXFXPPKXVOcRQnYvInK1MeZQatxKFZIkZBW5/J9/I/ucU+5w2vzrog6Hle88UaGQ5yTxx9xYyqRTdBUcCrXi7DwnFDbx5vueZgaN4FCM3GkbAd33vmkEB9+UlZ5gqwQHIDtNo6+7QSM4aIjdN/taJrm/Lnq6BEpd3+KkirkGdDd0ntt508zI1E+lyBEcUnPbp48MVG08c+a3h7pFJFNuCIUg0dSIaMQEY0TtWqjlbsid2xUcAODkP/mF1jEKEYTsTSg6EFKBy//xkqzxh+/00+lBe1FwUBLrpgBg2ipwqHQKraiRM2eIlAlkJka4OfhAmXoOviC3d4vOvoG+97MgCreAwg2i3UOA/DSNwEvOJWYV7pzNXWNsr89UKnivtOcqcze1LuyODZrzsve9eNOKiyo5qQ2r8v44JOss5P7o5AbtGcUl3blbxSqdcbl78QkOIZdDiblDfN9HfrZ17A8f/itZ6xFCdh8UHQhZAS778q+qxx4+/mfCL+41wSEn2NK0CnW/jq6tXLdrikZ0TuU46APXnD8x+7obgukHFQOX2N/E9t/2qyI4LHve0Phgx4caezZWGsNA9RWiqRV95k618lyGu6HL/LZw2aQ61PoMuuazvm6IGWYiGO1rFFnduX3FhlRQnuVWGBlMjCz8IMVSJGq6G3Ln3x9I03CFiM3xUbzru9+YtQ9CyGpD0YGQXcZlt7xBPfbwXX+ufbBk54kluhuKFpY0Zue++MSJVg0N1dJ57go3FSJU86KA4NAalxUwDpNO4UvlCI0Nj9MNFKOz+mvz+FvnVU3TyDlBuU7F6ytyL1IBfJ+5+47NHL/ghtCc37P4Y7wmSccaX5r3Y8BUjU5jI66OId0NXcdve36BjcfbWYJAaO5QPYdcMSN3/A//+bNbxyhEELJ7oehAyBpz2c2/rBp3+ISf3/lmrwkOQDo4bYSIWCCcO2dDn3QKTdHAVIHFbMeA/w/HzmJEtUBRP7hk61DTuc1nxholArICgXu4KGnG2BA5+/C5IWLz9HxftEUru8w9XcD5di521ew2UWFug2lPMyM711TIrTDE+EY8sNMcsgpTpuYfoL7CxPnBCwX+Nd0NuWLDptMpw8YWIpqOGr9zUn7dLULI8FB0IITgsptepxp3+OBzpl/sgnSK4q0za7TiLFi/oSGnpsL879HEfdXcy0aMMFl/1euHeoO/0Pm1BQdFwL4SgkNj3tGc43vi7pmryz6GTgFZXDxwTLPOqjgnGnw30hfQ9UzViL5ffa/TU2NhLkSUeO9DAW6hz5WvzoIkuj+0xgf2OA6IFiUFAVeEGGfOH5p7X+Ae1HZDAMCPfrzdYYxCBCGrB0UHQoiay264ODnm8D2eV2fx0u4GYHmCQwWxAVh+OkWV1Iue7oYSNQiynuw2p0SKdu60+czYg2eeKDljNW053e6CRrefcKcNz8GKgXsrrSDmiigQoIYFsf5z+xYysbaUwblrOif0Q+edKyql/9T8XI3Hk3SxSvt4RXdDbsC+MXNDeIUUz1w13Q254/dH3BDAjhBxm/HW/NibDv1m1hqEkLJQdCCEFOWy6y5Mjjl84vPzJh06naLLWOW4vm0NvXN2cTeoxlqDE2t0uvepvzMHSqeI1kUoELB0KdrZtc1ndkDWQwALxQkGZfZcJI0hY+ykZtHK3PF99LtkJ5D+hSiDLS5LpXXkdM4Izu0/PBoHnAmZ88cEgZYQMTZZAkJobKg9Z+kg3xYi5l8r1wi6IQK9nWuKGTanHnlG6xiFCEKGg6IDIWRwLrv2guSYw99y1vSLaEBo/WGk7QjhG6c4Fi9sWEFwAOLRaWOdryA4dHU3JPdS4vq9T8grpVPUDhKXmKbRRWzI+ay1hJYST/6rPm0PvVBgL1VFFWUQZgDT/MVnvxmx82uKKqm13aFjkydEVPxc5boVxjORQ+soqOluyHZDWEUkvcUqrbSK2nvJHW+7HEKceuQZ2D9adE386oN+O2sdQogOig6EkJXkss+eF3398H1eOP96Zeo3RM6b77FUYG63E0wNXYV0itnY5F5ybP5ZNT7UQwNPdvVje+9BnaZhB4/6fVRL74npcloRInMf3vclV9vKEe4GLloZH18gPSJUJ6LEvoM/M/2dFnPcqQp9roqkRyj2sihE7BSu1KxTs76C9jobIWLfaDKvF6FZJzTG11IzW5zIagDd5qf/6sdaxyhEENIfig6EkF3JZZ95dXLMKfc9e+ebJRaMzBVFVOPVrgXdOPW6uWM7pJNEXSXOWA1DuRtiaRol9hBM04jMvbBubv3XLvdY03q0HWfF1670/uWIDaq5fWkZPYtW+kWVgkF7az1PfYXYHMsQSkLYQoFGFMrSTOvdcwDY56R8xFwRtR0COdc6Hk1aIodbrNLeQ3U3RIbgMILBvkA7UJfnfOIprWMXP/Ad6rUIIRQdCCFrzOWfPjf6+ikPePHigaXWb9CuPZtbFZh38fzHqXJNQHZgGa3D4A4PpY0PENi21ik893QBxTxLcDeExqvOMZ6vY+fFhBdfC89K98M7d9GilTWLP0bm7ltjITB3sABmjZ+ZRk9pPoAm7GhYmD6nvkLFVI3pvs1CUJ8KykOvjz1uiOy0kYyuHRMjgEC999hrPqEg193Q1w0BUIggJBeKDoSQPcvlf/PK6OunPPCl7YOlBYdqgbkoWyXuDGraXrqYHAeGtb5unH7K7GA4Mb75u9bM/6NYp2dAPliaRnM9bitM3546ii/V2maG9lGgvkJxd0PXscb5N3V+rGhh3xSTzGBzLhRo348V6ZIBYFobwiLWeaK2uyG3sKRP5PC5CoD67oYcRmK8RSRL7T3X3ZDDOMMNcezoVpz9Nz/YOn7uA34va01C1hWKDoQQEuDyT5wTfO3kQy8LvrZUwaGCMKByVXRaXz900GC4QOX8Pu6GWGDc2zXhu7bcQDxzH132nCUOKN+v6H1tFZzNWD93vAT2Egzi+wftwfovNQJrd0ojunVCaUUFHAVZvz8mAhmZhRSHaFAembuEoyBb/EA7oA8F8rG5fUJBF8Ehd6x27zEB4RhPS80ugkMJbCHimFnRypfe79IicxOym6DoQAghHbjiyMuirz/+oWHBAkAlJ0AFwUE7bv5E3a6CGDm3guDQJRBWpWlUDrBXYe7k2qP8PZQqFtlprMdBIEa5p5r3ucvcoWKPveau+xQfrsgRu4bK7oas2g0j4xU5fDUWsu8h8t0NOYzEBItIuoH8OHP+mmJDM95XRBII1Iio7G7IGi8Gx0i6U4bNOX/7/a1jFCLIukPRgRBCKvC+v/SkZsx4/He9QjdJDcGhVncK7wSOlTnHMQGshtVfIk+Je86rxZ+mEXosnLGHjPG6VJ3M8Zl7cMdr3BDuGF8spE0v6eWG6HCN0etTVeMMzR1KowrvRT93xthZjYIiqU19RRjo6jvMx4rx3/bQj2UkCB971u0iOOSO1bbwjAkOPpGjy15yx088N9onLsQEB1/aRBfBQUvqWhshYnO0I2C84Nsuy9oPIasMRQdCCBmY933sJdHXH/fdr1xqOgWQkyKiXz6LFREctEyyUlD0Q2uladQuFqmmpjNEmaKxED9qAuBlOjha4xMdG9w5V6W+ghh/EckCqU255+SIDUC4vgKA1v6NEYwyXAI1xYZmfExEWBAiMu979c4UEq+vYAsR2xntO4G6YkOzjw3R1YawOf+aw61jFCLIboWiAyGErBjv//MXB1973MOs4pdLTKeYzqkfql5/X44wol9+SBdCcl5FcLjU1ASL0vd4PqZmTr4tNuS28Fx4IX8frbkqCw4qYWWhE4iVa9JhL6ZIfYVM4SOngGgso8vnKMh1N+Qw28tk4n+TXDEiNr9P5KjpKLD3su3ZvytcRLtNiH6sjz6FJbc8PyAbzn5igoPXDVHxvo89dTRczr/mMI4dfX3h2Onf+sGsdQhZBhQdCCFkF/H+j4YFicc+8lXtg7XSKWo4MZRtMJvUAm2O/qoIDsnxdjkM+wF2V8u5YmzVopV9xnUcn1OAcqeuR84CnmOZwe/Q3Sb8BUUDNQoquxty546KAtq0DN/UHdwNeSekA85GjBjPAltjRLVO7aBdAt0mbBohokmvmBhRrVNz743YkOo20QgR+zAdtw1ROR26uBtyGMukkxsCAF7/d9/TOkYhgqwaFB0IIWRN+MCfvCj42mMe/erouVXSKSoIDq0lAn/XTcZ6UWI6kX7Nmi4EX/0Ibx2CzHn7XF+pNA31+s16Xd0NmvEl750v+DWK8zRzt8bnp0doa5JMB/vnCM3txSuqVCxcmSpv4cwVExzc14Zum5mqsxB1FGS4DzR7yR3vLfg4G5Pai1tEsmbbTKAtIGx73jhbiIgJDm4RyRruhsX5dePf9LmHt46deu+PZK1FSEkoOhBCyB7gyg+9MPja9zzmvOBrC8UfawgOGWJDtdoCK5Cm0WkPqhz+jD1gNa5PM9YWGbq4G3L3olrDnTsVAOe4IaoG7Uo3Qem5vePzhkMUa7h1FmYtMZNTV9x7M/e+cTqANE3BTewE9qnAtqbg0IzdP04/lZ8YAWRRkCi5965iw/5Ru6WmyzZkHiQ1NSJSboeagkMjNmxmdsqwoRBBlkkv0UFEbg/gnQAOArgBwJOMMV/zjLscwHcC+DNjzBP6rEkIIaQsH7zyrOBrj378a6ZfxAKkhUCqjruhRv0GTTcN+ynxKgTkRhRtPo3n69xaBClquSEyhKKVKXCZM77De1O3+OOsk0GOK0NbYyGyb28RyQHfHzPxOAosISKrvkJPd0OX8T5XAZAOet1aDCX2EiK0l657d9Mm+robkuM9829705LSe3fTJmq5G3bG66712NGtePu1J7WOP/XEj2etR4iGvk6HswBcaYw5T0TOmn1/pmfcBQCOBfA/e65HCCFkQD70Pt+vdODRJ7+mfTAiOLSC0gqCQ15QWW79BRGgYuCUJby4lvrYw+wVEFO6jE+2v4wcK7YPa2xW4G4TDOLjgUO/Fp4VnuK7UxrRrTPA+6NxNtgOiCbNIRlkd3A35I4PdspwMKYdFPvacXbZT9euGqnaEA0TSEuMCJ07lNiQqg3RsI0Rtp0lYrUZurgb9ONnTg5JOzli2ELEptwKAPjBe/51rzkJ6Ss6PBHAo2ZfvxXAh+ERHYwxV4rIo9zjhBBCdicfusIvRgDAow6fHz4xIja4QVS97hR5UU7ob9ahOhXUFgW0wXvvopVd6gN4iN2PhQKc451jnQWBUuNz5wbCxR77zt3ROeHtXJHaS+oaYu9lT0dBCQeCr8YCkC646T5pXoajAAC2HUfHeJSe2w32S+0ld/xR538I+7CdFBxcoaCEuyE4NjL3lqP6bsh2UmxwhYpa7gYgX7gBgN/7wne0jlGIIDn0FR3uaIy5Zfb1lwHcsc9kInIagNMA4MCBAz23RgghZBl8+LIXeI8/8vsuUM8RDlDbL1RzOCTy+Ju/8eZ/vkXs8ospKOotVBUcYte3ELxnTNtlHzbFumm4y6SElYEcHMnaEKm5FzateHpvxz5D1FfQYNUo0KeYVNhHM3x2X8SX8hFCWXCzptgA7ASaOU/PU8Uq++4ld7xbANM7tqlp4bnRvgC6pthgz78vo9vEtueH3/e+1RQbgJ37tTnqXhuioREi7Lm+9+5/23tesp4kRQcR+QCAO3leOtv+xhhjJLvqziLGmEsAXAIAhw4d6jUXIYSQ1eJP/vD5wddsQaJvOoW/JWE5sSG5B9//vRRzLhRHXJE0hokdtKZy+VcltUQ5Vox1ffa1xc5fkfdFpQotiCo160JYX6sKbvoUoI57ceeqWF8hOtYjQiQdBePhHAWxNAvAESIU99AtIpn1lL1wZwqfEBHDLiLZVWxQj0ei9aj1S1/TLtMtIlm16GZi7yHee/39WscoRBBAIToYYx4bek1EviIixxtjbhGR4wF8tejuCCGE7AlCgsTD/4ffHdHX3RASFqp2Qqgx7yqkdBjn39R6ffdRyA0RHOtchxlj0NSLtBtCGTwsFK0M59J0dnzkju/yXMp3St/UH1SurzDbiz81o712bUdBIzi4RSR92HvROCJKplO0xlpv/v5xukaBPd5X8NEVDIYSHI5RdMqwHQ8Tzy8A1/1QvaXobO8bitoQmvvy3uvvh+NmtSEaHnnwc1l7IrufvukVlwJ4OoDzZv/+Qe8dEUIIITM+8vt+MeK//eCFugn6OBxCTopKgZlm3iGKVuaKHsEg2SdCVNpH1U4WQLXgt2bQ7pt8Ga8AACAASURBVH1fYjUWqro4rGA2lcaQTDHJ24dbG6JmAUVVu1fnPTBGguvYIkdpd4OL5lqbvU+sf0PpEXZtiNpBsmb8trt3CDYCqQx2bYjS7obWeEU6xVyIkOZ7Cd5Tu4hkbXdD7r2x+ZMb7t06RiFivekrOpwH4HdF5JkAbgTwJAAQkUMAnmWMOXX2/UcAfCuA24rIzQCeaYy5oufahBBC9ih/9nvPC772sB+6cNh0ihA1gmaVMNFtD1n7yJx7vieFjb6IgBByspQUBewMB/v6NGv0CNoX1guQ85neOclez51PV/yxRcegXdNtYmEfClGoan0Fay1NgO3OnXIV1BQc7HU03SbcvR+dtD9sthBRMwXAHq/pNuEGyVueHxRbiKgpONhigya1wnU7+FqP2ve6puBg3xeVG0I598dvvHvr2El3u169L7LaiDGrWTrh0KFD5siRI8veBiGEkDXhYT/82vnXzd+a0eDMDbw8wZYJdePoUCBREyiacTrim88TGartFOKvj6EY44xX1+mwakgEzxklXrfGLMyds29bBMmsxxGbz4yQDNrbjhtPSoQmPUhZX0HlsGncCamxC4KX/+9Lr9PBFQhSQfO8jogiwLfWCwkJmjFAIL3C2XsqyG7md2s6+BiP07Z6O3iNiQ2+9Ar3WlOiw3zvilSNTSclwrf3BXEiEiT70ivc8SnRIaf4423Gi7UTfOKDPU8sqPalV7juhpTo0AgObk0HH26BSN99tcfE9u4TFNx7kRIdmvk3FeKE5voAChGrhohcbYw5lBrX1+lACCGE7Ao++q7neo9/14+81nu8oe/T/2CAWNPODqifuq9CDQnA6bSAcDxpUDf1oso1Guv6muvKLZKYWiLH3dDVFh1zFMzFrvIpCd7xmnVcoSnhKOjqblANtx0FCsHBtxff0+1Gh+zqbsgdrxEcfGN8e2/IeSqf/QR/wcmRFhx8KRe+GhH7mvve0d2gwXY3aAJyn7ATK7TZ1d2gGg9775qaHLq9bMpRfPLvT2gd//YDN+k3R5YCRQdCCCF7mo/9b78Y8Z0/GhcjWvQIhHMcFznzxv4+TwXj2hoXXiqnobh//wadGpUEo9D4rLGe92YuTGT8gZ+dSmHXV0gKH5oNuN9LJ0FgWeONEcjsIhpRwheUj7qmmATmKzHWZnuysylXgLBdDjXTTDSChA87MHZFBdvl0EdwSBGq75Bi27L3uEG87XLoIzikx+bdl0ZE2caO0rvfEWRsB0PNNBOt2JDCFiKOnble7nXXLxWZm5SBogMhhBDi4S9+J0OMqFiocX5eKJWjy7zwx4XeOTLSNGoGkkYQTBloiRCZ21iZVpgN7hsRSlWo6W7oc08CBSvVaRqF9qKpDeELqv2dJ/L33ifA13TKCAWbtgABAONR5ZoWWBQcNLUhQnv3PZmvKTYAi4JDl9oQDdueX1A1xYbp+J297Fc5Cvx7v9Wxmm3I0epFNG3BwRU9vOMz9/P5m+/cOkYhYnlQdCCEEEIyCIkRJz3touh5Sy9C2YyPBKr233TG/qJ0ccSKBS7tv52TwkqB4De4t6JFK3deNPtMfF3v3N3TBoy2vkIKI5h/qtQpJsq5O4zv6iiIFdy0g6Ka7obc4AtIp5bYQkFNd0OXvaeEiK7dJnLdDV26NWx7fuGGikjWdDfkCjeArvXo/HhFd0OXz0yIRojYtOY84S63FJufhKHoQAghhBTg4791hvf4Q34iLka06CM45LgScuaN5fKn1s3YY/LcAuPFjnsjAeTiSXn7qOqcaE4L1bwQxaASe8m+Jz4FKDJvxb0s1HFItfBEJAh3D0t9R4EdgKWeoqea+CwIEU3q0kCCQ+rcVJDsEyKGEhxStSFSAbgtRDSiw1CCQ7LwY2JuW4hoClIOJTjsR/y+d02RuemLx7eOUYgoD0UHQgghpCJX/a8MMaJSQJ7TRlM9rwl8XejJf61ikUYCAkxKWNEQqi0REnyy3kNdoCELRSsDRTB67MM7Ptm9I+Op/8hWhSJrpo77hlYWBIBQakZ7rtruhoyuwQvEHBGNUFDb3dDlqTygezJf292Qm2LQMPH8knCFiNr3sYuTAwiklTj3oba7oavgEOKmLx6PY2Ux5eSb7nxz0TX2GhQdCCGEkCUQEiMOnVouTSO3yGCRFBBfsJhRtLKGu6HT3FY2QOt4aHzO3A7RtqoZnQn85Qj8NRZCewlSwt3QdX57qlH+3qvWV1DsownmN/Ztz7/X7iknAHPFho1x/OmwZg+uEHF0MlILDzl7jxWR1Iz30QgRTVHHLTNSB6g5QXisiKR/7vQeGiHimNEWtjHCtkm312zIERzc69yUW7PG+2iEiE3ZwjYE2xhjI+FUaMj5zLjv5Ubi3HFHQQsA/ulLd20doxChh6IDIYQQskIceZNfjHjwaRdXExxqddPYmVA3V/T6nD3VFCcQckMA+ifwkbm15IgNQEcBplqKyeLeTSyNoeNTeY0oVN3d0EP4SNVZqO1u6FN34uik/QNiCxG1n8r3Caq3PD/cdvBa292QU1zSdTtsub2F4dSFqOxu6CPEbMGzd9g1Leq6G3IEh7HyB/s/brlb69hxx9+oXmcvQdGBEEII2QVcfclzvMcf9D8vbh3rVb8hhjU2uYZmXudvQDG6/VRzNwCZooD9TWKu7IKfngkD9zz/GnU1Cjp1m1h2HYlmy7O95zgKsgSHSBHJPnMbIxiPp8HUZPbGpudWTR3cS6rbhHbvRycjbM7cCdq99xUbUt0mtEHylhnhNuNpjYLGHZE6t6/YkHItaOs8bJkxjht9HcBOrYvUfe0rNiRrQyjvzRbGOG7mrNB+ZvqKDRuJnxet4BCCQoQfig6EEELILuavfr0tRnzHT7eFCJeawXifsbF4OLnnPm6IGvcjt+4F6robsgWB+SK+uXrO78v4iF17j/cy5SgY0t3QZfzEs/8mMBvS3ZDCl3IR2/uQ7obk3J7xsRoRQ7obknN79hLr+DGkuyGFL+Ui9plZBXdD7vhjZANHv3xi6/i+O12btd5uh6IDIYQQsmb89a/6XRGNGFEtGM9Jl8idG+2YNjR/bF2vQ6OiOOFxQwfTTXrXbgDCRR1LB9bNdL7r6zt317EZ440RjPZN5l8DiiC7r6NgXMZRAOwEscY6JSZA9BU/UjUccopLNmPtwDgmKPRNGUh1m8ix9Tdz2cUTY4F2jtgw3UueGyInyG/cCbaYEhMU+qaZpPaurfEA7HSu2Fro/BG577mfGeeH+xiJW/n6uiEA7DkhgqIDIYQQskcIiREPPD3gjBhAnNCkgoQC7JYIkbEFdx/Fx2cW8YSYIqJKaG792My5bWIFK7vMneumyHEgeASeqCNiYHdDjFCQbJzD+/dtV99LqU4W7pP5zfFW9foEuTUEQvO73Rs2R1u9xYbkXnK7QQTupevmOG709eo1LXLEBiD8Prm1OY4dbfcWG0qPH2X/j2B9oehACCGE7HE+8Xq/GPHtP59O0wBQTZzoWrvB9zdqa64cN0RusJxTU2OEnW4M7rIeUaVEOkVwjhrvoxGYmaNgHg8UdsBkOxAyHCUjXwvPio6CWKeM3CAZSKeWaI6HcAWHWG2ILnuPpQi49BUcYt0murSSTBV8XNxLP8Fhc7QVHNul/aim9WhoLylcwWF/xA3R5TOz7fnMhISIvoLDRsQNkSs2jDDC6E6fyzpnt0HRgRBCCCFePvm6thixIETUTEuwxyf+ftME4uLGjjUC4NwWpR0KfgZrXrRElYruhqx74lOAInMW2EtIVMgRG4BIEO4cboSCmvUSSnaysIWIjVkhxpz9lHI3BMdHAmVbiNg/EwpyRIFS7obg+EgQbgsRx45une1Hfy9LuRuC80eu1RYiGpEjK7WjkLuhy3hbiNic1+TQ/6Kp7W7YK24Iig6EEEIIUeMTIgDgAWdEXBEVu03Mx2vSNHxjQn+rJvbR2meuuyEDI+n526KK6ISHUAqHL0DPdnxkBOE+R0FszYruhuzCkjO0roKc+X3BVMy6n1tYskG79xzBwbf32PldnsoD+ifzOYGs7/xYbYhcQaBh4vll4BMicub33cdYt4kuTg6gnVYC+PeZIzj43qP9kfO7uCEAYNtzj3ziQo7g4BMPNiRc9GaviA0NFB0IIYQQ0pu/uagtRtz/ecr0jBm1WmHmBvml3A2+PVZrZwpP0cpYjYWh3Q1d5/aJED1rN0SPFy642QTzG/vynvQCZd0N7bHpued7H9ffe47goBnbCBGxtIkQNWsapIorAjtCxDGRtIkQNetgaMY2QsSmdNh7RfePptZDI0RsygiTptOH8pcN3Q1pKDoQQgghpAqfutDvinDFiM7uBs1Y62+73JabUXL33MXdUGHs3AGhrFEQfc13TTmCQ1fnRCw9wz5U093Qo+BmylVQQmyICQVdnRwAcHTSftNt90IJsWH/OCwUdHVDAPFWjEAZsaFJV/GhERxCpFwFJcSGTbk1a7yWLU+LG9v9UEJs2CzYycJmy+vc2HkvKDbooehACCGEkEHxiRH3PTPtisgWJ3L+vuv6t6AiAI7uwwmMawowEOMf3zHFZIFAgB9sA1raaWEtU6pjQ7CoY8beR8p0BGME41lLzSY41gRjpd0NXcYfnYywORMKcvZe2t1gow2SJ0Zwm/H0qXzjjtCcW9rdYKOt87CNEY4bfR3ATq0LzX0q7W5YGK+8L1sY47iZyJH1mSnsblgcr/th2sIEx8o0hJ7MrlcjJsTGrHsRSYCiAyGEEEJWgE+/xu+KaMSIqukUthuixIOo5m/d2Vzzegu5dSIKjV3YhGpss0jkNZuS6RR9xgIY7bOCnsT+a7sbtIJDaC+xJ/O5tRu89RmitSH6FZaM7T1XQPCN3xdxFPQtLBmrEZHdrcEjOMREiL6FJWMdP7IFBM/4aG2IjHvjEwSin5ls8cO399j4nNoN7bETz7U3IsNedjfYUHQghBBCyMriEyO+7UVhV8QQ7gbVGpFyCgtzIT/to0TbzPD4iDsBcNIyygTtwTSIKi08rS9nN1IVYAfm9wVDOWKDev0ZTRFJs+DsKDN3l/E5hSWbsXZgHBMgatYnAPIC2aaIpJ3mEAuya7kbNGu39zIVCmwxJXavata0mI7Xz98UkbQFidj7VsvdMF87Y3xTRHKykAazdwUIig6EEEII2VVc8yq/K+I+L80oXFnrb78Ouf7u39AhUWEQd4MW+/5pHBEV3Q25c7siR7TGQgF3w7hQ0cpQsGVCmk0BwSEkKpRqmxl7Mp9DTreJUm0zfXUWjo3URQjhExxCokWptpleN0euYymwn/Dey3zefY4ISBnBYSOg4OWIDdPx/v/BxBwR604v0UFEbg/gnQAOArgBwJOMMV9zxjwQwBsBfAOAbQDnGmPe2WddQgghhBCXz5zTFiNaQkTNv++sv0tTboiYgNASIRLjASxeV+2iiCOkUyrcl41ynWCLTM96FcWJqRChL7hZ090A5AXK+2edMlwxJbRmTXcDkLf3zfFWlhBR092QO//maAtbrRYy4SC8prsByBNvNkdbuNWz9/2FxI9SgoOPTdnGxLQFrI3AHDXdDdPx+v/J7BXBAejvdDgLwJXGmPNE5KzZ92c6Y/4TwNOMMZ8XkTsDuFpErjDG/EvPtQkhhBBCoviECAD41pfntfNMUqvd52xs6G/w1lyRP9a96xZqD+rFnTvmiKjsbsiaWoy/iKRP9xiZrKA9t2hldpAcEYNajg7pX7sBCNeGKNk20ydE9K3dAIRbapZMMXCFiA3Z7l27AZgKBT5KpqW4QsSGHO1duwEIt9Qs2TZzy7RFiL61GwBgU9rizHR8t04We6GIJNBfdHgigEfNvn4rgA/DER2MMZ+zvv6SiHwVwDcDoOhACCGEkKXwd7/YFiM6CRF9uk0k3AIacWJepNI+qUeNgiAd2olGa0M0GOdfZ47Q3D5GY08wVKDgYnjw9J9UC8xOcyOzUn+mNb5p7ajde013Q26QvH/UrlHQ4Auga7obcp/4HztqOja0f6B8QkRNd0OusNJ0yki179w5Vu/znvueHjv7+dj27MknRNDdUJ6+osMdjTG3zL7+MoA7xgaLyEMB7AfwhcDrpwE4DQAOHDjQc2uEEEIIIXp8QgQAfMsrAmJExW4T8/GKv09bc3tznu3Kg5G53OC1r7shMTZYRNI93OXv9IrtJCHAOBKILwbzZYKvceDpeK7gkLpWnxChJbT3kGhRopOFjS1E7Mu8jFAQHqoNUaKThc2CEJFbiDJwX0LdJnIFh1CaRYMtRGwgt4imfy/7A/PkCg6hNIsGW4jYKCQ2bBRyQ6wTSdFBRD4A4E6el862vzHGGIn8FhOR4wG8DcDTjTHen1JjzCUALgGAQ4cO5VczIYQQQggpzGdf0hYj7v0qvSuiZitM9Xgj+a0tO7gbqowvOLdP5OjiblAPt+bWuApquhtyhZWN8U7Qd3TS/jC4QkJNd0PueDttItaKsaGmuyG3k8UxVtqExlVQ092QEhtc7LSJbV9KDLp/3kuLDS6bsnOvJ5576rof6G7IIyk6GGMeG3pNRL4iIscbY26ZiQpfDYz7BgB/DOBsY8xfdN4tIYQQQsgK8LkXpYWIagKCO1bjhtAGqIJ0YO3OVVtA6FBVXzV15YKbIiYpDOwIEdNxEyOq4Co0b8h9UaLuhEsjROybpbVo9x4KkveP/U/lawTVrhCxbUR1bkhwaNJVWsczgnZtnQdXiJhAVPcodH0hN0SO4KAVYlwhQv2ZCbohAu9Hloik+8F2hYgJJioxgYLDlL7pFZcCeDqA82b//oE7QET2A3gPgN8yxry753qEEEIIISuJT4gAgBNfE3dFVBUnugTssYKPqWMxKhd/nKPYfyywbhV1rFkXAsDYqUURezJf292QO37TEQpie6/tbsh9in+b8WIxw1iNiNruhtxOFk19hYZYx4/a7obce3Oc01Y0+pmp7G7I7WRxrCyGzrEWmCpBYo8UkQT6iw7nAfhdEXkmgBsBPAkAROQQgGcZY06dHXsEgG8SkWfMznuGMeYTPdcmhBBCCFl5rj2zLUY0QkTV1As7QE2cm5w7U7vIWbtFhyA/WBtiviHnWyO6ALui4JAzdmIE+0aLAVoqIAvN7+s2UbNtZrNnOzBOCQqh1/d5HAU122ZuG8E+WXQXpILskODgO16zbWZzv20xJXWvQoKDzw1Rs23mxAggeZ/3kOCw4fkZrtk2cypEjBcECbodADFmNUsnHDp0yBw5cmTZ2yCEEEIIGYR7XnhR++Dsb9WoKOD8Pet1N8SKR86LViqD8Ng4t3NF4m/1lljgGx9Yzw6Uk6LDbO7UuHm7zMS+3TSGUNAecibY40PtMuevi1EH+Rvj7aSA4IoOQXEi1CLTOh5ql9mQs/fN8VZSjHBFh9zij3bgGmqXac8dmsdlc7SVdDe4r4cEh9A8dpAfapc5nxsmmDbhsjnaSrob3LmCaSbBve/c91C7zIaRmGARSZdN2U66G1zRISQ4bIj/uC04hNpl7owdBYtI+saug9NBRK42xhxKjevrdCCEEEIIIQX4wvPOaB27x8UeISJCTjpFdpMCzXh3eRM+T3q4IboUf9QIE9MaC2bxOlLCSSV3A5BvLwfaBStDa8b24hMKarbNbHDTBEIiROyJvU8oqNk2s2HLLAaboQA85m7wnVOzbWbDrc7eQyJEbC/+vdf/vG85n/eQCBFzN/gEh5ptM/ciFB0IIYQQQlaU657TFiKAthiRW7shS3BYKFrZISUhdUrUxbF4cs3ij8G5A4dTe3FdDjl7zw2+RmKCRSRbXTOkbjpF9t5hgkUkfbUKaqZT5M49xiRYRNInQtRMp+hSAyPkhnBFiA05WjWdosvnPVRE0idC1EynyBUb9qo4QdGBEEIIIWSX4RMj7v4rr02eV8Xd0HX8AO6G3LlTqQ42mhaYoWMxugRgWpq9aPceExt8qRVdBIfcsbGCj9q9+FIruggOWhoXwMS0A06fEBGb25daUbPoZrMXTfvO6bHw3L7Uipqf99Hso7Lt2ZNPiIiJDb7Uij6CwzqkVuRA0YEQQgghZA24/mef2zpmCxGd3Q2Z41WuixIOhOb1Ht0msrs7qFtgAprqm7bIUTP4AqbXGqvBYDKK9vXdS5dOFr4ikg22ELEv87NbU2wApoJDrN7DghCR2/WicoePMSbR+hG2ELGhrMPQUP0zJsBm5BxbiNionEqxV90NNhQdCCGEEELWFJ8QcfANCUfECrkbAP1T+dqtLRvBQRP82HNr9j+Eu6HL+Fg7Q81efE6JLu4GLePMvefWhujibtBiOx40roLYvfF2m+jgbugyftuXEgP9Z8ZXRLKLu0GL7XiYeO6p636ICQi+IpIUHKZQdCCEEEII2UPc8DNtIQIADr7xwroCgjVexokgItXi0wooRRGYug6FrOKPmfUyNHPv7H86dmIkGFjZgXsXd0Pu+P3jeLA8D+Zl53vNvrq4G3LQdJtwhYhtI6pgvIu7IYeRTJLnuELEBKK6R7WdHGNo9r5439WfmQ7uhhzGkGDXigZXiJhgohISKDYsQtGBEEIIIYTghmc/r3Xs4K9d6B88kDiRHGoHJb74xK2hWDidIjR3qFVmbC+pJ/OxAEzbwlO7lxTuXpJ7jwTHbhHJ2ikD7t5TNSKiHRuclI8+7gYN7l58hTbt+xe7N9o2mNq9pMeX+7y7RST7uBs0uG6HiefaF+o1UHBoQdGBEEIIIYR4ueFZHiHiNy7QT9BHnEjVctAEm84QYyR4nl1foYa7oct4OzBrvk49/a0pODRrx2pDNCzsffbmpgSFmoJDs3dfEUmXbSPz2hCNwyAVZNcUHJq1Y/UVGmwhohFUUveppuDQiA2+IpIuEyMLDhog/XmvKTg0YoOviKTLVIgYW1+HxYe9VkQSoOhACCGEEEIyuOGnnt861hIiBnI3qMQBZ+5UjYWu7obc8ZpOGb42mL4nxGPFXlyhYBldNXxP5oG02OAWkazZNjM0v6/OwgbiRSKBthhRs20m4L+XPjfHhqTndkWOmm0zgcBnxlcBV9Jig1tEsmbbzOn49ucj5YjYS1B0IIQQQgghvfAJEXd7y/npEysXf9TOb4zMnRWNKOFbyw6KajoKfGJDCldMia3Xxd2QOz7WbtPFFSNiIkQXd4OW8dzJoXctbJnFp+AxEaKLu0FLc898RSRDuEJKbM0u7gYtzfvkKyIZYuIsERMhurgb9OOn99BXRJLsQNGBEEIIIYQU58affEHr2IIQUVNwsItWKhwFPteBzxEBMdXrJdiCQyrAjgXVrf1Lei9uEcmaXTViwoLPEZG6F65QUMLdEBwbCcB9IkRKbHCFihLuhhCx69R0zXBp773iZyYy1hUhIGmxwS0iWcLdUGLsOkLRgRBCCCGEDIJPiACAg7/1muA5tdwNgC7FwSWVnmEXkazpbsgNqgF9+9GaYgOwEyS7RSRjpAo+dt1L1+4ObhHJGBPTDjh9QkRNsQHYudY+bgjAv8+aYoM93i0iGWPbsyefEFFTbOgyfh2h6EAIIYQQQpbKDU87s3Xs7r/96rxJMp0TOYUjU+LBYjBvVOfY5AgObrCWOjdv72nc2hCl3A1dxttCxD7FZbhFJEu5G3ykaj0sCBGKdA63vkIpd4OP/RntOzcUKRFuEclS7gb/+PjrthCxofil4RaR7Otu2ItFJAGKDoQQQgghZAW5/sde2DoWFCIquhuynRYzYq6CZg+13Q3NeppuE/ZeUu0Mu+ylq+DgFpH0YQfVmr13dTdoaQQHTUcL2/GgcRXUbim6f773tBvC3tu2LyUGPT8zHQUHt4ikD9vxMPHcU9f9QHdDPyg6EEIIIYSQXYFPiLjH/36V+vwcwcEVG0q0qjTzNoCT+fea87qKDVo04sc8mLdaGob2ZReRLO1ucNEE1a4QsW0keJ5dG6K0u8FFU1jSFSImkOA9soWC0u4GF829cYWI2GfGLiJZ2t3goiks2QgR22b2L7aDxSLt4xQb/FB0IIQQQgghu5brfuRFrWOuEFHb3ZDVDcIJ8EOOiCZorCk42GKDptuEu5eUq6Cm4GAH1ZpuExtOgJ+qEVFTcLDFBs157l58hTbte1dTcLD3ott75memouBgiw1uEUnv3M593jLt66XgoIOiAyGEEEIIWSt8QsS93vVK1bk5Qbs7dpwQN1zBIYTdwnMyd0f0d1rY1ErtsIPKJjj2iQl2EcnaKQOu4BBi28i8NkTjMPCJD3YRyRruBhut+GELEY2g4rtPthuihrthcXzGZ8Zy0AD+z5tdRLKGu8FGW1xyy+w4ICaz/VF8aEPRgRBCCCGErD2f/+EXt47ZQsSQ7oYuc/ueEG/MWlwO1SVDUxvCFyz6nszPx1csiGiLDbm1IRp8dRaa4old3Q0a7ADfLSLpnd9zH31ujo3Zoa7uBt34nb24RSR9eD8z3pa1zficvXQXGzYU4oEv5WLiuV8jjPZsEUmAogMhhBBCCNmj+ISIb/m9c6Ln5IoTruCQckN0KVxpp2jEzq9ZuLJLC09gUZBwA2dbKKjlbugy92ie778TlI6d9WxBopa7wd5LLreanWDZFSAWakNUcjcAPT4z1mmuALG5kCJTx90A+MUGEoaiAyGEEEIIITM++4MvbR1rhIih3Q3R+QPj3RoR+8dHB+gaYLkhFNcdckz4HBE1xQZ3fk1tiFAQbgsQ031sVxUbgEXBQdVtInAvbQGimaum2AAsfmb2K9puhj6TE/ew1BUbgEXBQSM+MN2CogMhhBBCCCFRfEIEAHzb77/Me7yv4BALtLs8Hda0kewyf+5eNOkZLqmCjzY13Q25QTgATEw72AwVkazpbsi9VkDXvnPneL3PTJfP+7ZnPyEhoqa7gWLDDr1EBxG5PYB3AjgI4AYATzLGfM0ZczcA7wEwArAB4FeMMb/WZ11CCCGEEEKWzTX/42WtY9/+Ry9Rn1/K3eAjlUphCxH7Z7Uh0FANhAAAE95JREFUhhIcUvUVUkG1LUTcZjytGZAT+PYRHI4ZxR0FbpqFy4IQMRMdhhIcUm6IVJ0HW4hoajUMJTjsT9yjVJ2H7YU6E9ProOAwHH2dDmcBuNIYc56InDX7/kxnzC0AvssY83URuS2AvxWRS40xX+q5NiGEEEIIISvFJ5/witYxnxCRlarhGRsTFXJrNzRoHBG13Q1daxRs+1IznLlquxtSgkMIjaugtrsht5NFg+a+10/vyRo+Z+K5p64QUUps2MtFJIH+osMTATxq9vVbAXwYjuhgjLnV+vYYgLIPIYQQQgjZO/iEiAdfdrbq3JLuhi5zN0LE/pk7YWJEvaccwSFWRNKHJqhuAuLGnbBtRB2M5wgOsSKSPjS1Hhoh4rjR1wFM611ohYccwSFWRNI7t+K+NPf9OJmGgTmfmTy3zeL3m4lzNbUeGiHiGEzFBrslZnI/DHOD9BUd7miMuWX29ZcB3NE3SEROAPDHAE4E8Hy6HAghhBBCyF7m6sPnto7ZQkTu016f4BB78t4nlSLliKjtbsgJqt2n7qkaEbXdDTnFJV3xwldo0753td0NWUIM8j4ztd0NOcUlXbfDlmnfJ1uIoNiQJik6iMgHANzJ89KCPGuMMRLwiRljbgLwABG5M4DfF5F3G2O+4lnrNACnAcCBAwcU2yeEEEIIIWQ98AkR33nFC6Pn1GyDmTN+YgSb46PzrzXn9hUb9qfqKyjn3zay44aYBZCpALuv2JByQ6Reb5hAcMysvkIjqKTEh75iQ2pv2vs+MYJNyfzM9BQbNiQ+gbbOw5bZxrGj/QCAyez+UHwIkxQdjDGPDb0mIl8RkeONMbeIyPEAvpqY60si8rcAHg7g3Z7XLwFwCQAcOnSoW0IXIYQQQggha8JfnPzq1rFGiCghOIRaXGbXbvDME3u6PaS7ocvcsToLQ7obknN7rjXm5hjS3ZDC9xmLfmYGdDek8KVcTDz3ikLElL7pFZcCeDqA82b//oE7QETuCuCfjDH/JSLfCOC/Abi457qEEEIIIYTsSXxCxCOufH5wfF93QypdIiRc+MfOakNYQV5MgMgv/li+NkTDTm2InUAynsKSJ064gsP+RH2FHOFmc1ZfwRYkYteenWbi7KXpbhEi5zPZdK6YWKfEBIgcsQHwFI9MCAXZxSX3eBFJoL/ocB6A3xWRZwK4EcCTAEBEDgF4ljHmVAD3AfDaWeqFALjQGPOpnusSQgghhBBCZvzpYy5oHXvMh87ImqOEu6HL/G6tgv2jo73FhuT4zPlDDgRbgACAzdFWb7EhRSmXiOuI2Bxt9RYbUpRK75k4h48dmdl+hnU3xOeny6Ghl+hgjPknAI/xHD8C4NTZ1+8H8IA+6xBCCCGEEELyuPLRF7WOhYSIvoJDzA2ROzeQLvi4cLxnEL4vEvTnCgIAMDHtYDMkRPQVHGLdJnKFFUDXvnPneD8BYT/C197lMwMA226b1ICw0FdwiAkQFBva9HU6EEIIIYQQQnYJPiHi8J/+vPr8Uu6G4PhIIGsLEbcZT+37OYFvKXdDeP7wvbGFiGNGW9nz16yBkRpvCxFN2kTOfa9VvLRhI7r3ndc2ZXodOYID3Q1loOhACCGEEELIHuayR7yudcwnROQIDv6ilZEn25lBdcO2J4D0BcQ5QbhPDIgJBLmFJRu2TDug9a2Tc29819nUc9CO16C9731aswI79Rx8xMSGGBPfPj3XkyM4UGyIQ9GBEEIIIYQQsoBPiPiBj/6M6tyS7gaXDUWA3wTExyRaavrnL+ducNHUemiEiONGX8/ax3QvNTuC6O/7cRGRI0RJd4OLps5DI0QcK/nhcUxwYBHJKRQdCCGEEEIIIUne87A3tI7ZQkQJsSHmhtAIDiFSNSJKiA2xOXKLS9q4hTaBxXtXQmyI1obILC5pE2uB6X6twSc2bBTsZGGTaoFJd4Meig6EEEIIIYSQTviEiCd/7FnJ80q7G2y09Qa2jeDY0fSpfBMca4Lg0u4GG634MYHgmFl9hUZQ0YgPpd0Ni+N1c0+MYHMmcuTc99LuBhttnYcJJjhGNuZfT8+l+JCCogMhhBBCCCGkGO/8rl9rHWuEiNzaDT7BIeaG6FtYMvZkPrd2g09wiIkKfQtLxtwc+S1I8/bet7Bk7L7n1m7wCQ4bEhYVcgpL+gSGlCOCUHQghBBCCCGEVMYnRPz4x08Njq/lbpiP71BYctvqQBETIGq5G+bzZ1xrU0TSFiRi117L3dCQk07RFJHcsvYeEyBquRt2xuuFhAkmFB4sKDoQQgghhBBCBudtJ72pdey0I0/PnscX+IbcELlP/ENBsi1ANDStMHPwCQ77A/UVSrXN9DkiNqSM4NC01HQp1TZzy7t3U0Rw2Ax0q8gVD5rxLCK5A0UHQgghhBBCyEpwyaG3to6FhIia7gYgL1DeHG1h4hEiQq6Hmu4GIO9aN2diybYTXIdEiJruhtzxx46mY7edPYVEiJruhi7j9woUHQghhBBCCCEri0+I+Nm/+lH1+aEA/JhCT+VjqRauEDGWraz5Q2JDqNtEybaZrgixge3etRsAYD/8gkvJtpmuCLEB6V27YbpmGTfEXoOiAyGEEEIIIWRX8SsP+p3WMZ8QUdPdkFtY8tjR1wGk20jOj1V0N+TelyZtYtsTuPuEiJruhtzCkpsyFQQmvn1625HS3VAaig6EEEIIIYSQXY9PiHjeJ5+sOjcU9IbSIHIFh1Q6xYIQkZcBEBQQmiKS2vHB+RO1HnxChJawGyKUltK/k4WNT4jQQrFBD0UHQgghhBBCyFpy4be/s3XMFSJquhtyazdsWsUoJ96n8E7tgoruhtzCksdZIofGzVHT3ZBbWPJY2QmLNS0wU4IDi0guQtGBEEIIIYQQsmfwCREv+dQPJM8LCQ4hYSFHcNAG4K4QsW1EJSaExgRrQ2QIDhuBGg0ucyFCdr7XXHdIcNgI6Ao5goO2zsOOEDGef0+ngx6KDoQQQgghhJA9zSvu/57WsUaIqO1uyK1/4BbA9LXAbESG2u4GreDQsOmIHDFHRG13Q24ni2NkY+F7jSOCTKHoQAghhBBCCCEOPiHi3E8/IXpO2PXQdhRkF1vMqD+wbQSQRUEiJUCEBAffNeWKDTnXOjGC0WixVkSqa0ZIcNgQX4pKvbaZdED4oehACCGEEEIIIQrOvu8ftY6df83h6u6GHMFhv2x7RQ6fI2JD6rsbslqEisGmx1niK1a5AVPd3ZAjIFBsCEPR4f9v7+5i5SjrOI7/fj2cFhKijUKglJaWAMZKtMqBQJQE34ELeiHBGl9AIUSR+BITbTTRiDd4oSQaX9JgAxqjJWigmiKiYsALsZWgQhHT0GJbiiAvRSLBtOfvxc6229nZ2ZnZ8+yePfv9JCfszD6757n483Dmx3+eAQAAAICGPr/mrq5zNz36nsKxZRfgi4u6IWo+XWFxzfBDkg7lLpZ7djyUhA1FvzflYzPbDuU31uwRKpSFDcd6qmB888dmsolkN0IHAAAAAJhDn339r7vOffext9f6jrrdDXVMOXpuIpkPIY7VQS2q2Q1Rt7uhjilFz00k8yHEtEx3wzxA6AAAAAAAiV33unu7zhUFEWVhQ1FQ0CRwqDw2CxtmCy6ui4KI0k6Ogk6JJoFD9bGtsGG24DNFQURZgDA9B90Qk4zQAQAAAABGoCiI2PSPt1X6bMqwQWoFDvmnTXQ6OohIu6dFnbChNd6Fm0i2FQURVRE21EfoAAAAAADzxMfO+kPXuXwQURY4FHVDNOluqKqz46HsEZi9jjsVbSLZpLuhqumOAKHKIzAJHJoZKHSw/RpJmyWtkrRb0hUR8XyPsa+StEPSHRFx/SC/FwAAAAAmRVEQsXnnuX0/16S7oY5Fmu3bcXE4iPCR4yqdDk26G+qY1iJNuzxEOBJETB0+Lgse2ESy2KCdDhsk/TYibrS9ITv+Qo+xX5N034C/DwAAAAAm3vvP2NZ1rjOIKAsc8t0Qg3Q3VBqfm0u/joiywCG/ieQg3Q1V5EOGKh0RONqgocM6SRdlr2+V9HsVhA62z5F0kqRfSZoZ8HcCAAAAAHKKgog7H19b+pmUgUM7SCjaRDJvNny4G+JQ9qJft0PKwKEdJBRtIpnXrwNi0g0aOpwUEfuz10+pFSwcxfYiSd+Q9CFJ7yr7MtvXSrpWklauXDng1AAAAABgsq07/aGuc1t3nd03bMhvIpnysZmSNF2wn8OhglBhWtE3bMhvIjlod8Ncj580fUMH27+RdHLBW1/qPIiIsAsr6zpJWyNir0t2EM2+Y6OkjZI0MzPTfEtRAAAAAEChS1c/3HXu7l1reo5v0t1QVTtsmK7xuUO5DoiyEKJJd0Oq8ZOqb+gQET27E2z/y/ayiNhve5mkpwuGXSDpQtvXSTpe0mLbL0XEhsazBgAAAADMmfeu3tF17v7dZ5R+Jr+J5Fx0N/RSdqtFPoRYokUVuiEGezJF15Mt2ESyp0Fvr9gi6UpJN2b/vDM/ICI+2H5t+ypJMwQOAAAAADC/XbhqZ9e5oiAiZdggHQkc8ptIlskHEa3vKdjAku6G5AYNHW6UdJvtqyU9IekKSbI9I+njEXHNgN8PAAAAAJgnioKIbf9c1XN8fhPJuepuKB5fnkp0BhHTFb4vv4kkgUMzjpifWyfMzMzE9u3bRz0NAAAAAEBN7SCiHTr0CxvyezoUBQ5lnQ7twGGJ+wcDU3LX7RWd8k+uqBI2TOLtFbb/HBF9n045aKcDAAAAAABHOXfl7q5zO/YsLxzbGTjMdXdDk/GzhzfOnDp8TJdDc4QOAAAAAIDk1qzY13WuM4hIGTh0ji3rcmjLhwyzBU/waI+ZxC6HOggdAAAAAAAjURREPL53Wde5zlsrUnQ3dKra1UAHRDWEDgAAAACAeeP0U/d3nduzrxVENO1uqKIzQMhvItlvPHojdAAAAAAAzGsrlncHEU/uO+Wo485NJFN1N9QdC0IHAAAAAMAYOmX5k13nXnhyRa3vqBsgEDjUR+gAAAAAAFgQlp6yp+tcZxDRuYnkXHQ3sIlkf4QOAAAAAIAFqyiIeHn/6sqfp7thMIQOAAAAAICJctyyXV3n8kEEYcPcIHQAAAAAAEy8oiBi9qmzRjCThYXQAQAAAACAAkV7NhBE1EPoAAAAAABARWweWQ83qQAAAAAAgCQIHQAAAAAAQBKEDgAAAAAAIAlCBwAAAAAAkAShAwAAAAAASILQAQAAAAAAJEHoAAAAAAAAkiB0AAAAAAAASRA6AAAAAACAJAgdAAAAAABAEo6IUc+hkO1nJD0x6nk0cIKkf496EliQqC2kQF0hFWoLqVBbSIG6QioLubZOi4gT+w2at6HDuLK9PSJmRj0PLDzUFlKgrpAKtYVUqC2kQF0hFWqL2ysAAAAAAEAihA4AAAAAACAJQoe5t3HUE8CCRW0hBeoKqVBbSIXaQgrUFVKZ+NpiTwcAAAAAAJAEnQ4AAAAAACAJQgcAAAAAAJAEoUNDti+2/ZjtnbY3FLy/xPbm7P0HbK8a/iwxbirU1VW2n7H9UPZzzSjmifFje5Ptp20/3ON92/5WVnt/tf2WYc8R46dCXV1k+0DHmvXlYc8R48n2Ctv32t5h+xHbny4Yw7qFWirWFesWarN9rO0/2f5LVltfLRgzsdeHhA4N2J6S9B1Jl0haI+kDttfkhl0t6fmIOEPSTZK+PtxZYtxUrCtJ2hwRa7Ofm4c6SYyzWyRdXPL+JZLOzH6ulfS9IcwJ4+8WldeVJN3fsWbdMIQ5YWE4KOlzEbFG0vmSPlnw30TWLdRVpa4k1i3U94qkd0TEmyStlXSx7fNzYyb2+pDQoZnzJO2MiMcj4n+SfippXW7MOkm3Zq9vl/RO2x7iHDF+qtQV0EhE3CfpuZIh6yT9MFr+KGmp7WXDmR3GVYW6AhqJiP0R8WD2+j+SHpW0PDeMdQu1VKwroLZsHXopO5zOfvJPbJjY60NCh2aWS9rTcbxX3QvW4TERcVDSAUmvHcrsMK6q1JUkvS9rI73d9orhTA0ToGr9AXVdkLWb3mX7DaOeDMZP1oL8ZkkP5N5i3UJjJXUlsW6hAdtTth+S9LSkeyKi55o1adeHhA7AePmFpFUR8UZJ9+hIWgoA89GDkk7L2k2/LemOEc8HY8b28ZJ+JukzEfHiqOeDhaFPXbFuoZGIOBQRayWdKuk822ePek7zBaFDM/skdf4f5lOzc4VjbB8j6dWSnh3K7DCu+tZVRDwbEa9khzdLOmdIc8PCV2VdA2qJiBfb7aYRsVXStO0TRjwtjAnb02pdGP44In5eMIR1C7X1qyvWLQwqIl6QdK+69zya2OtDQodmtkk60/Zq24slrZe0JTdmi6Qrs9eXS/pdROTv6wE69a2r3L2ql6l1LyIwF7ZI+ki2G/z5kg5ExP5RTwrjzfbJ7ftVbZ+n1t8dE/EHFgaT1c0PJD0aEd/sMYx1C7VUqSvWLTRh+0TbS7PXx0l6t6S/54ZN7PXhMaOewDiKiIO2r5d0t6QpSZsi4hHbN0jaHhFb1FrQfmR7p1qbbK0f3YwxDirW1adsX6bW7svPSbpqZBPGWLH9E0kXSTrB9l5JX1FrkyNFxPclbZV0qaSdkv4r6aOjmSnGSYW6ulzSJ2wflPSypPWT8gcWBvZWSR+W9LfsHmlJ+qKklRLrFhqrUlesW2himaRbs6fRLZJ0W0T8kuvDFvPvEAAAAAAASIHbKwAAAAAAQBKEDgAAAAAAIAlCBwAAAAAAkAShAwAAAAAASILQAQAAAAAAJEHoAAAAAAAAkiB0AAAAAAAASfwf9F6YtX4ui5EAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot solution\n", + "scale_factor = 1000\n", + "plot(u*scale_factor, title='Displacement', mode='displacement')" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.0004555058526919105" + ] + }, + "execution_count": 191, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u.vector().min()" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 192, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot stress\n", + "s = sigma(u) - (1./3)*tr(sigma(u))*Identity(dim) # deviatoric stress\n", + "von_Mises = sqrt(3./2*inner(s, s))\n", + "von_Mises = project(von_Mises, V)\n", + "plot(von_Mises, title='Von Mises stress')" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "min/max u: -2.4213610711295385e-10 0.0004564935128009332\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Compute magnitude of displacement\n", + "u_magnitude = sqrt(dot(u, u))\n", + "u_magnitude = project(u_magnitude, V)\n", + "plot(u_magnitude, 'Displacement magnitude')\n", + "print('min/max u:',\n", + " u_magnitude.vector().vec().array.min(),\n", + " u_magnitude.vector().vec().array.max())" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 194, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "stress = project(sigma(u),T0)\n", + "plt.figure(figsize=(18, 16))\n", + "plot(stress[0,0], title='$\\sigma_{xx}$')" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 195, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "plot(stress[0,1], title='$\\sigma_{xy}$')" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 196, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "plot(stress[1,1], title='$\\sigma_{yy}$')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-3/tutorials/2_load_and_boundary_conditions.ipynb b/jupyter_notebooks/day-3/tutorials/2_load_and_boundary_conditions.ipynb new file mode 100644 index 0000000..bd267ea --- /dev/null +++ b/jupyter_notebooks/day-3/tutorials/2_load_and_boundary_conditions.ipynb @@ -0,0 +1,495 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Loads and boundary conditions\n", + "\n", + "\n", + "The preceding tutorial focused on body forces. However, in situations where you need to apply traction force or a Dirichlet Boundary Condition (DBC) to specific parts of the mesh, this tutorial will address those scenarios." + ] + }, + { + "cell_type": "code", + "execution_count": 417, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mesh entities\n", + "Conceptually, a mesh (modeled by the class Mesh), consists of a collection of mesh entities. A mesh entity is a pair (d, i), where d is the topological dimension of the mesh entity and i is a unique index of the mesh entity. Mesh entities are numbered within each topological dimension from 0 to nd − 1, where nd is the number of mesh entities of topological dimension d.\n", + "\n", + "| Entity | Dimension | \n", + "| -------------------- | ------------------- |\n", + "| Vertex | 0 |\n", + "| Edge | 1 |\n", + "| Face | 2 |\n", + "| Facet | D-1 |\n", + "| Cell | D |" + ] + }, + { + "cell_type": "code", + "execution_count": 438, + "metadata": {}, + "outputs": [], + "source": [ + "length, depth = .6, .200\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))" + ] + }, + { + "cell_type": "code", + "execution_count": 439, + "metadata": {}, + "outputs": [], + "source": [ + "V = FunctionSpace(mesh, 'CG', 1)\n", + "U = VectorFunctionSpace(mesh, 'CG', 1)\n", + "T0 = TensorFunctionSpace(mesh, 'DG', 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 440, + "metadata": {}, + "outputs": [], + "source": [ + "dim = mesh.topology().dim()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the boundaries (Subdomains)" + ] + }, + { + "cell_type": "code", + "execution_count": 460, + "metadata": {}, + "outputs": [], + "source": [ + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "load_boundary = CompiledSubDomain(\"near(x[1],0.2) && x[0]>0.5\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mark the boundaries on mesh" + ] + }, + { + "cell_type": "code", + "execution_count": 461, + "metadata": {}, + "outputs": [], + "source": [ + "support_tag, load_tag = 1, 2\n", + "mf = MeshFunction(\"size_t\", mesh, 1)\n", + "mf.set_all(0)\n", + "clamped_boundary.mark(mf,support_tag)\n", + "load_boundary.mark(mf,load_tag)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize the boundaries" + ] + }, + { + "cell_type": "code", + "execution_count": 462, + "metadata": {}, + "outputs": [], + "source": [ + "with XDMFFile(\"input/subdomains.xdmf\") as outfile:\n", + " outfile.write(mf)" + ] + }, + { + "cell_type": "code", + "execution_count": 463, + "metadata": {}, + "outputs": [], + "source": [ + "bc = DirichletBC(U, Constant((0,)*dim), clamped_boundary)" + ] + }, + { + "cell_type": "code", + "execution_count": 464, + "metadata": {}, + "outputs": [], + "source": [ + "E, nu = 2e11, 0.3\n", + "rho, g = 7800, 9.81" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{align}\n", + "\\sigma &= \\lambda\\,\\hbox{tr}\\,(\\varepsilon) I + 2\\mu\\varepsilon,\\\\\n", + "\\varepsilon &= \\frac{1}{2}\\left(\\nabla u + (\\nabla u)^{\\top}\\right),\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 465, + "metadata": {}, + "outputs": [], + "source": [ + "lmbda = (E * nu) / ((1 + nu) * (1 - 2 * nu))\n", + "mu = E / (2 * (1 + nu))\n", + "\n", + "\n", + "def epsilon(u):\n", + " return 0.5*(grad(u) + grad(u).T)\n", + "\n", + "\n", + "def sigma(u):\n", + " return lmbda*tr(epsilon(u))*Identity(dim) + 2*mu*epsilon(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 466, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variational problem\n", + "u, v = TrialFunction(U), TestFunction(U)" + ] + }, + { + "cell_type": "code", + "execution_count": 467, + "metadata": {}, + "outputs": [], + "source": [ + "f = Constant((0, -rho*g))" + ] + }, + { + "cell_type": "code", + "execution_count": 468, + "metadata": {}, + "outputs": [], + "source": [ + "ds = Measure(\"ds\",subdomain_data=mf)" + ] + }, + { + "cell_type": "code", + "execution_count": 469, + "metadata": {}, + "outputs": [], + "source": [ + "a = inner(sigma(u), epsilon(v))*dx\n", + "t = Constant((0,100))\n", + "L = dot(f, v)*dx + dot(t,v)*ds(load_tag)\n", + "\n", + "# Compute solution\n", + "u = Function(U)\n", + "solve(a == L, u, bc)" + ] + }, + { + "cell_type": "code", + "execution_count": 470, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 470, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot solution\n", + "scale_factor = 1e5\n", + "plot(u*scale_factor, title='Displacement', mode='displacement')" + ] + }, + { + "cell_type": "code", + "execution_count": 471, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1.8010419648112784e-06" + ] + }, + "execution_count": 471, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u.vector().min()" + ] + }, + { + "cell_type": "code", + "execution_count": 472, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 472, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot stress\n", + "s = sigma(u) - (1./3)*tr(sigma(u))*Identity(dim) # deviatoric stress\n", + "von_Mises = sqrt(3./2*inner(s, s))\n", + "von_Mises = project(von_Mises, V)\n", + "plot(von_Mises, title='Von Mises stress')" + ] + }, + { + "cell_type": "code", + "execution_count": 473, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "min/max u: -5.71041349380966e-13 1.8360022678476485e-06\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Compute magnitude of displacement\n", + "u_magnitude = sqrt(dot(u, u))\n", + "u_magnitude = project(u_magnitude, V)\n", + "plot(u_magnitude, 'Displacement magnitude')\n", + "print('min/max u:',\n", + " u_magnitude.vector().vec().array.min(),\n", + " u_magnitude.vector().vec().array.max())" + ] + }, + { + "cell_type": "code", + "execution_count": 474, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 474, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "stress = project(sigma(u),T0)\n", + "plt.figure(figsize=(18, 16))\n", + "plot(stress[0,0], title='$\\sigma_{xx}$')" + ] + }, + { + "cell_type": "code", + "execution_count": 475, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 475, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABCYAAAF9CAYAAADY2mmsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3X/wZXdd5/nXu7u/3emA3Qm/1pBkJTNEHXAoHEJwd2vQmR0wuiPBEkmAUdhizKqTnd0atcRyFjHqFujW+GPMukRAB0YnOrHA3hUqqyJb7qwwCUqBwWJsYpZ0BouFJJ2B/Ohv9/e9f9x7+p5777n3fM6559fn83k+qlL0937vvd9z22un7zPvz+dj7i4AAAAAAIAxHBr7AgAAAAAAQL4IEwAAAAAAYDSECQAAAAAAMBrCBAAAAAAAGA1hAgAAAAAAjIYwAQAAAAAARkOYAAAAAAAAoyFMAAAAAACA0RAmAABAL8xsz8x+xsweMLN9M/P5P58c+9oAAMB0HBn7AgAAQLJ+WtI3S/q7kh6W9LuSHpP0w2NeFAAAmBZz97GvAQAAJMbMvkrSFyS9yN3/cn7bD0i6yd2/ZcxrAwAA08JSDgAA0IeXS7q/iBJzl0v665GuBwAATBRhAgAA9OHZkh4pvjAzk/Sdkv4PMztqZv/ezC4xs+80s18xs283s7fN7/sMM/u9cS4bAAAMjT0mAABAH/5c0t8xsxdL+oykn5Dkkn7L3ffN7N2SfknSsyS9VtIzJP1388f+mKS3D3/JAABgDIQJAADQOXe/18x+RtIHJZmkuyV9u7vvz+/y/0j6XyVd6e7nJX3BzJ5pZldLep67//EoFw4AAAbH5pcAAGBQZvYsSb8l6Q8lnXP3/2V+++9IOizpf3L3T414iQAAYEDsMQEAAAZjZsckvVfS/yjp5yTdZGZPm3/745LOEiUAAMhLUJgwsxvM7DNmdtrM3lLx/X9mZp82s0+a2R+a2deUvvdGM/vL+T9vLN3+EjP71Pw5f2m+KRYAAEiYuz/l7t/u7p9y9313f6m7f2X+7RdJeuuY1wcAAIZXGybM7LCk2yV9m6QXSHqdmb1g5W5/Juk6d3+RpLsk/ez8sc/QbLOrl0m6XtJPmNnl88f8iqTvk3Tt/J8bdn41AAAgOmb21WZ2StIfu/v/O/b1AACAYYVMTFwv6bS73+/u5yTdKenG8h3c/Y/c/fH5lx+VdNX8198q6ffd/WF3f0TS70u6wcyukHTC3T/qs00u3ivp1R28HgAAEBl3/2t3f5W73z72tQAAgOGFhIkrJT1Y+vrM/LZN3izpQzWPvXL+69DnBAAAAAAACer0uFAz+0eSrpP0zR0+5y2SbpGkwzrykqcduVw6ZJLNm8ohk5stEouZ3CQ/NN+y4pDkptlBZar4dfF9zW4vf1/mpeeVzJZPMKn7+lDN14fXvj6ouf/y90O/d/E+qr+PJB0JeK4mzxebkN9LAAuHxelOQEoOs+sXgAwdFn/47erPPnnui+7+7DaPDQkTD0m6uvT1VfPblpjZP5D045K+2d2fKj32W1Ye+5H57Vet3L72nJLk7ndIukOSTu49x//LK98gHTs2+94lezo4tqeDSw5Lkg6OHdaFo7OScOGSQ7pwzHTh6OwNduGo6cJR6eDo7Hkv7M1+XXx9sCcdHJ395frgqMuPHkhHZx9Qbe9AR45eWLquvb3zS19fcnT56+N7+0tfX7p3bunrp698fWLvyeWvj6x+/YS2OVnz/Yv3O/x47X0uC7jP8v2/Un+nyF12KOz3F8Bmlx16qv5OAKJykvPdACTq5KFjY19CdC597gOt94kKCRP3SLrWzK7RLB7cLOn15TuY2TdKeqekG9z9C6Vv3S3pfy5tePlKST/m7g+b2WNm9k2SPibpeyX9y9orObSoWEWUKIREiUIRJS4+tipKFK9tb/2/nk8tSnTt0QuXNooTj1542sVfpxopHj04vnYbsQJo5tGD8H/BEzGAOJxtMGRIxAAQk7MH638XIVb0pzZMuPt5M7tVs8hwWNJ73P0+M7tN0r3ufkqzc8ifLunfzk/9/Nx8E6uHzeynNIsbknSbuz88//UPSvp1Scc125PiQwpx7NhSlDi45LAOjh2++O0iSlz8uhQlDo4uR4mDo7MoUViKEkcPLkaJ8rTEVKPE2fPHg6cm+pRDpChUxQqJYAF0gYgBpCckYhAvAExZOVYQKbpls0Mx4nDykiv8v/i6fyxJF5dwFFHiwtFDS1FiFiSKXy+ihLRYwnFw8WvfGCWkOMKENO5yjvrnSztS7IqYAfSPgAGkhYgBYGzEiWWXPveBj7v7dW0e2+nml72bL+Uo7yshLaLE4uv6KFEoosRFkUaJqctpkqKNTdMXmxAygOaYwgDSwjISAGNbXe5BqGgvrjAhVW52WUSJ8r4SkpY2u5SqN7ssokR5s8vC6oaXZVOMEl0u52i6z0Sz5yZS7KouZBAugN0QMYC0sIwEwBDYl6K9qMKE2yI6lDe7lBR0AsfFx5Y2u5S0dgJHlfK0RN9RIidFpCBQdKvpBIZEzADaCo0YBAxg2uriBeECQBtMVYSJKkxIi80uV0/gKGw7gaPYVyLkBI5tSzhid/bCpUH7TAyJKYrxsZwE6BcBA4gbS0cAdIGpimpxhYlD2ngCR7GvxOoJHIXQEzjq5DQt0edyju0/l0gRg5CQQbwAmmMZCRA/lo4AaIJYEVuYsCJCbN7sUgo7geOio+v/5tg0LTFklHjs/PHR95mQxosTi59PpIgZS0qAfjGFAcRrU7wgWACQFrEil0ARV5iQKje7XD2Bo7DtBI5N+0ps2/CySyGTEm3jRNfGjhOL62A/ihw0iRlEDCBMSMAgXgDTwLQFgLKzB09lESeiChNuCjqBo9hXYvUEjovPU3ECR5U+pyVC9RUnmu4zMZU4ITFFgYXQiEHAAOqxhASIR+h+FwQMIA05xImowkSh6gSOi9/bcgLHxX0ldtzwMuV9JbaZUpwolCOFRKhANaYwgG6xhASIw7aAQbQA4pJ6nIgqTPgh23gCR7GvxOoJHIXVEzikzUeDripPS4wRJZpOTXS9z0TZFONEGaECuyJiAN2pCxiEC2A87HEBxCflOBFVmND8D8ptm10WX69udlk+gaNK6IaXY+ljSUfbY0OnHifKVkOFRKxAdziZBNgNy0eA6SFYANOWapyIK0xIlZtdrp7AUdh2AkebDS/HXsIxlc0wpbjixCpiBYbEBAbQDZaPAONiU05gOlKME1GFCTcFncBR7CuxdAJHoE3TEmNHiaZCl3O0nZqQZnFCUrSBoowlIJgCNvMEdrctYBAtgH7VxQvCBdCd1OJEVGGiUHUCR6HyBA5p52mJsjGjxJSWdBSKQCGlESkkQgWmjSUkQDtMXQDjqgoXxAoAUmxhwrTxBI5iX4m1EzikoKNBpfBpiRTtGicKKUYKiVCB+LCEBGiPgAEMZzVWECqAcClNTUQVJny+32WbEzgKbY4HLZvCEo6+9proKk4UUo0U0nKoIFIgdiwhAdrh1BGge0xVAM2kEieiChNS2AkcSzYs4dhm07TEFKJEE22ODe06ThRyiRQhCBmIFUtIgGbY7wLoBhtvAtudPVj8OyXWSBFXmLCwEzhCNrvc9XjQuigRs77iRCGlTTPb2BYyiBaIHdMXQBiWiwDd4phTYKYcKaR4QkVcYWIu+ASODo8HXZ2WGFvfR4f2HSektKco2iJaIBcEDCBMSMAgXgCbsYcFchdLqIgqTLgFnsAh9brhZei0xGPnL4lyOcfFxw4QJwq5T1GE2BQtCBZIGctHgHosGQHCESqAaYoqTGj+B0fVCRzbdLnhZYxLOHaJE0NjiqK5JntcEDGQorp4QbhAzogWwHaECuRmqptlxhUmVH0ChxS2hGOb0A0vm5rC1ITUPk4MOTWxiimK7tVFDMIFUsTRqUA1ThUB1hEqkIMpxomowoRb9QkcIZtdSuNteNlXnGi6z0SMcUIiUAyJcIHcMX0BLBAuAI4vBYYSVZgoVB4LWuhpw8sYl3BUiTVOSCzzmIKQZSPEC6SMPS+ABZaJIFecAIIUTG1qIq4wYev7SQy14WVZmygxlSUdUtxxosAUxXSF7nlBwECqiBfA5mhBsEDKysGCSAE0E1WYcJv9b91ml1K/G162RZzoXnmKokCsiAMBAzkjXiBXTFkgF+xVgRhMaWoiqjAh7X48aFmbDS93XcLRdZxous9EWSpxYtVqrCBUxI3lI8gV+10gN+xpgZQxTYGpmkqciCtMWODddpyWKCtPS0x1X4ld4kRbU48TZYSK9DF9gRwxdYHcsDwEqSBSAOviChMlUz0eNEQfSzraxom2UxPSLE5IiiZQFAgV+WL6Arlh6gI5IFggZiz5wBRMYWoi2jARosvjQbuelphanJC0c6AoiylWVO1TUSBa5Cd0+mIb4gZiETJ1sYqYgVjULQ2RiBeYHkIFxjJ2nIgyTOw6LVE29LREWV9xQtLg0xNrzxV5rChsixYF4gVWdRE3VhE7MBVtYkYZYQNTQrzA1BEqMKQx40SUYSJEl3tL9KmvkzraBopdpye2PveGD/kxBouykHhRh7iBOl3HDkIHxsKUBmJDvMCUECrQt7MHsz/Phg4U0YWJMU7ikKTH9i/pbfPLx85fIkm9BYqxpydqf1aiwaKJXeMGYQNNMdWBmOwypUHUwBCIFxgLG2miL0MHiqAwYWY3SPpFSYclvcvd377y/ZdL+gVJL5J0s7vfNb/970n6+dJdv37+/Q+Y2a9L+mZJZ+ffe5O7f6LtC+nrJI4h5TQ9EfTzCRbBupjaWEXsQFO7xA6iBvoSGjUIGOgb8QJ9Y5oCfRhqeUdtmDCzw5Jul/QKSWck3WNmp9z906W7fU7SmyT9cPmx7v5Hkl48f55nSDot6f8s3eVHiogRxHzx6w6nJUL1OTVx8WfUxIldpit23RxTGi9SlG0KFqsIGLthigNDYqkKxtZ2KoOggS6txgtCBXZBqEBXhpieCJmYuF7SaXe/X5LM7E5JN0q6GCbc/YH597bVgtdI+pC7d/5pZddpifIyjrGmJcpW40QRI1bvIzUPFLtsjiktRwppGqFiEwLGuPqY4igjfGCbpqGDkIG2mgYNQgaaYMoCXSJUYFd9Tk+EhIkrJT1Y+vqMpJe1+Fk3S/oXK7f9jJm9VdIfSnqLu4f9yTrCtERhiKkJqTpGbLpf2+kJqX2gKKyGisKUg8WqkIBBvJieXcIHUQOruprYIHCgTl3IIFygqbp4QbjAJoQKtNFXnBhk80szu0LS35Z0d+nmH5P015KOSrpD0o9Kuq3isbdIukWSDj/jsvXn3jAtEarNEaFDxYlQYyzvqJNCsCgjXqSl62kOQgcKIYGDeIFtmMBA1wgXCMVGmhhTSJh4SNLVpa+vmt/WxGslvd/dL44quPvn5798ysx+TSv7U5Tud4dm4ULHvuYqD52WKC/jaDIt8eX9o0HLOaYWJ6Txlnc0kVqwKAtdOrINcSNOTG+gCaYz0KUmIYOIgSrlcEGkQKGIFAQKDCUkTNwj6Vozu0azIHGzpNc3/Dmv02xC4iIzu8LdP29mJunVkv684XOOMi1RNsU4IY2/vKONlINFE03jBiEjfl1MbxA38hQaOAgYKGyKGAQLFNh8E6sIFKjSx3KO2jDh7ufN7FbNlmEclvQed7/PzG6TdK+7nzKzl0p6v6TLJX2Hmf2ku79QkszseZpNXPxfK0/9G2b2bEkm6ROSvr+j19R6WqKNx/bnUwoTCxS7Lu8ojBEpyjYFi0Ju4WJVF1MaEoEjdm3iBjEjH00mNIgYeQqZuiBe5GnbMhCiRV7OHhAn0C9z9/p7TcSxa67yK37iv5e0fVoiJEzUTUu0OZ1janGi0CZObH6u+P5iknu86BNBAwQOlBE2UCBk5I1okTYCBQqrUxOXPveBj7v7dW2ea5DNL4e0KUoMYcpLO6RuAsVjFRMMU48VdVMXBQJGc+yrgZBpDeJFPrZNZxAt8sKykbwxaZE2NslEH6IME232lmi6jCN0E8xVfceJXZaOdBkolp83vlhRhWUj42gbNwga8ejyFBQiR7zYEwNSdbAgVuSFzTbTQqRAV6IME5s0mZZ4fP/ozptfbtJlnChCxKbb2waKruPE+s+o/pAfY7AoMHkxLQSNPDGhkb62p5YQNOK1bY8LokXaiBRpIVLkp8tNMKMLE+VpiVB9bHpZZ5c4sSlGbLtv059VTE9I3U9QbP+5m//yEXO0KAsNGJsQNvq16/ITwsb0NZnQIGKkY1PQIFjEjeNQ80GkSAuRAk1FFybKyss4+thbou1yjkJonGgSInb9WZWPPb/884cMFcvXkX60CBESNogX4wkNGwSMOOyyzISoEQf2vcgH+1qkg2NL00KkSFtXUxNxhQlr/pBt0xJ9LucoVE00dBEiQn9Wq+eZSKgo2xYtpLzChbTbVAZRYxgc5Zq+uqhBuJi+NstGiBnxYV+L+FVtpkmsiFMRKQgUWBVXmCjZNC0xVX3FiE0/q8sNOMda9tFEXbgo5BYwqrSJGsSM8TChEa/QaQwCRlzqYgbhIg6rsYJQEZ9NJ38QLOJw9oA4gWXRholNuj4idNflHGPpanpi7XnPrweWqcaKKkxetMPGn9PXdEKDkDEdbZaTEDOmi70u4sQykHSwDCQeTE+ko4vlHFGGiSbTEk/s742+nGNMfQWKpZ9RESukuIJFgXCxm103/pSIG0Nps9SEmDEdLCOJD8EiTiGbbxIvpo1NNaeP6QlIkYaJTbqelkjJ6lKSPkPFxZ+ZULAohC4ZkYgYbTGdMV0hMYN4MQ3bwgXRYlqa7HNBxJgm9rCIB5FiuogTiC5M9LG3RN3UxJSWc3x5/6gk7Xw95VAxRKRY+tkbgkUh5nBR1iRiSISMptpOZxA0+sUkxvSxdCRenDASD/awmL4iUhAopoOlHXE7e7Db/y9FFyY22TYtUbecY8qKELHp9i6CyRjTFNtsCxepRIsqISGDeLG7JkGDiDEMNvicPiYwpq8qWhArpoNQMV1MUUwP0xN5iipMmPnFX8dwEkcbm0JE3f27nOiYWqgoq5u2kIgXq4gZ7bGsZFpYSjJN7HcxXexrMV2EimkiUkwH0xP5iSpM9GnM5RxNY8Sm5+jr+qYcKqrkslQkFPti9I9lJdPB9MX0MG0xPQSL6SFUTA9LPaaB6Yl8JBMmnjx3JJrlHF2EiLrn7XNPjNhCxSrCxWahEYOA0Y2QoEG86AcBYxpC97sgYAyjbiNOwsVw6k4DIVwMhymK8REn8hBlmBhrGUfbqYS+QkSTnzlkqCiLLVpIhIsQLCkZDstJxlUXMAgXw2DqYhqYtJiOcrggUgynHCkKxIphsLQjfVGGib7ULecINUaIqDNkqCjbFi2kNMNFgYCxjGmMfrGp5zjY92J8m6IFwWI4bLw5LpaBjIslH8NieiJd0YWJbdMSQyzn2DQ1McUYsc1YoWJVatMWZQSMdggY/WMJybCIF+NgymJcxIrxECrGQaAYDnEiTdGFiSmILUKEGGp/iiZSjhZluZ800habevaLJSTDYsnIsDhJZBzEinGw7GNY7EkxDJZ2pCe7MFE3NdHVco4+PL4SRPq6zqlMU2yT4hKRbZi+2A1TGP1h+mIYhIthsTxkOOxbMSymKYbFFEX/mJ5IR1Rhwsy3fn/bMo5C3VKOKUaJ1SCx6facQ8Wq3MJFgYCxm5CAQbxori5eEC52ty1cEC26Q7AYzmqwIFT0g1AxDAJFv4gTaYgqTGxTFyVC9paYYpSQFte1KVCgudiPPN1VVcAgVoTZFC8IFu1tChcEi25URQtiRbdWgwWhonvlUEGk6E8RKggU/SBQ9IelHfFLIkzsGiWmGiRWXbp3bhJxYor7UeyqHCpyixSFTdMWBIswVcGCWLGbqmBBrOjGaqwgVHSLUNEvpin6R6Do16MHx4gTPWF6Il7Rh4lcokSIMfbHSD1SSPmGigLBoj2mK7pHrOgHoaJfhIp+MU3RHwJFf5ie6A9xIk7Rhomh9pPY9GF7jJM5pjAtsU3xe5JKoCgQKqqxHKQ9piu6RazoHss/+lUOFUSKbhEp+sHJHv0hUPSDOBGfKMPEEFMSdR+un753LsljQ7uQ4hRFWdXGmsSKGWJFe0xXdGs1VhAqdsdURT+IFP0hUvSDKYp+ECi6R5yIS3Rhou8o0eSDdHHfKQWKqR13mnqkKBArNmMpyG6YrugGUxXdY6qieyz56A+RonsEin6w/0S3iBPxiCpM1B0XOmSUWH3clOLEVKW61GMTYsV2TFe0R6zoBlMV3WOqoltMU/SDSNEtlnl0j+mJbhEn4hBVmNiki6NAd/2wPMXpianKZYqiCrFiO6Yr2luNFYSK5piq6F45VBApdsM0RT+KSEGg6AZTFN1ieqI7xInpiz5MDLGfRBNTmJ6Y2nKObXKboqhCrKjHdEVzTFV0g1jRHaYpukWo6BaBolsEiu4QJ7pDnJi2qMPEWEs36vQRJ6Z+Iseucp6iqEKsqEesaI4NNrtBrOgGoaJbLPvoBss8ukWg6AZxojvEiemKNkxMNUqsPv/Y0xMxavp7lkvIIFbUI1a0w3TF7tivYneEiu4wTdENpii6wz4Uu2Pfie4QJ6YpujAxhf0kmhhraUdMyzl2lfO0BbGiHrGiHWLFbggVuyNUdKcIFQSKdpii6BZTFLtheqIbxInpCQoTZnaDpF+UdFjSu9z97Svff7mkX5D0Ikk3u/tdpe9dkPSp+Zefc/dXzW+/RtKdkp4p6eOSvsfdt36qPFRzKseUgkTVz2V6on+rv8e5hQqpOlZIBIsyNtlsh1jRXjlUECnaIVTsjuUeuyNSdOfRg+PEiZaIE90gTkxLbZgws8OSbpf0CklnJN1jZqfc/dOlu31O0psk/XDFUzzh7i+uuP0dkn7e3e80s/9N0psl/UrD679oqlFi9RqIE8MiVCwQLOoRLJrjNJDm2KOiG4SK3RApdkek2B3TE+2xtKMbxInpCJmYuF7SaXe/X5LM7E5JN0q6GCbc/YH59w5CfqiZmaS/L+n185v+laS3qWWYiCFKFIacnshpOUcoQsU6loPUWw0WhIrNCBXtECt2x9Gk7bHUY3dEit0QKNpjemJ3xIlpCAkTV0p6sPT1GUkva/AzLjGzeyWdl/R2d/+AZss3HnX386XnvLLBc0oa/ihQpIdQUY1YsR2hIhyhoj32qWiPSNEOm2Z2g00z22N5RztMT+yOODG+ITa//Bp3f8jM/oakD5vZpySdDX2wmd0i6RZJOvqcExdvj2lKYlepHxU6JZsmWVJ6P7W1GisIFQuEinDsU9EeoaIdIkV7LPfYDVMU7TA90R7TE7shTowrJEw8JOnq0tdXzW8L4u4Pzf/3fjP7iKRvlPQ7ki4zsyPzqYmNz+nud0i6Q5Ke/rVf7VJeUWJXLOfoRlWwyP19xlTFZuxV0UxVrJAIFnUIFc0RKdpjmmI3TFE0x/REO0xP7IY4MZ6QMHGPpGvnp2g8JOlmLfaG2MrMLpf0uLs/ZWbPkvRfSfpZd3cz+yNJr9HsZI43SvrdkOckSmAqmK5YR6zYjqNLm2EZSDOc/NEMm2fuhmmKdggUzTA90R7TE4hNbZhw9/NmdqukuzU7LvQ97n6fmd0m6V53P2VmL5X0fkmXS/oOM/tJd3+hpL8l6Z3zTTEPabbHRLFp5o9KutPMflrSn0l6d9211B0XGssHQk7mSBvTFcs4DWQ7YkU4QkU4pimaI1S0x+aZzREomiFQtMP0RDtMTYzD3Ld/2J+SE1/3n/nL3rk+rBHbh76mYaKLPSaKSZOu96tgmUh7sb1vh0CsqEaoCEOoCEOkaIdQ0QyRohkCRTMEiuaIE80RJ5q74qrPf9zdr2vz2CE2v+wVH+7C9LWBZvG8BIrmmKxYxwab1ZiqCFOeqCBSbMY0RTvsT9EMUxTNMEHRDBMUzbG0A1MXdZjI4UNcLCdylK+TSNEesWIZe1Zsxkkg27HsI9xqqJCIFXWIFOHYi6IZAkUzBIpmiBPNsKRjWFGGiZw/qMWAKYpuESuWMVVRjVCxHceUNsNURTgiRTimKMIRKJohUIQjTjRDnBhOdGEi5w9ksdl12oOwsRmxYoFQUY1QUY9YEY4TP8IQKcIwRRGOQNEMR4yGIU40Q5wYRlRh4nDNqRwx4ESOcE3CBhGDWFHgFJBqVftUSASLVexTUY9IEYZIEYYpijBFoJCIFHWYnghDnMDURBUmxlL1gWbThx+MYzViECpmiBUL7FdRjcmKzdinoh5LPsIUkYJAsRlTFOGYogjD9EQ94kQ4pib6R5hYEfpB5cTek8SJCauatiBWzBArFlgGso5QsRmhoh7TFNsxRRGGSBGGQFGPOFGPOBGOONGv7MPELh9EiBNx2bQ0hGCxHisIFTOECkLFNiz72I5IsR2RIgxLPeoRKLZjaUc94kQ44kR/sgoTsX3IiOWo0NgRLNYxVTFDqFhHqKjGNMV2RIrtypFCIlRUYYqi3qMXnkac2ILpie2IExhb0mGCDxHYBctBljFVwT4VVQgV1QgVm7EvRT32pNiOKYrNmJ7YjjixHXEiDFMT/UgmTOT+4QDDYLpigamKGaYqlhEqqhEqNmOaYjOWe2xHoNiMQLEZSzu2I06EIU50L8owEetf/DkqNF1MV8wwVUGoWEWoqMb+FNWIFJsRKTYjUGxGoNiM6YnNiBNhiBPdiipMHLaDqP+S//S9c8SJjHCEKaFCIlSsKocKIsUMkaIakWIzlnpUI1Bsxv4T1YgTmxEnMLSowgQQs3KoyDFSSMuhIsdIIS2HCiIFkWJVESkIFMuKSEGgWEagqEagqMb0RDXixGbEiXpMTXSH38Yd9fnBItcPrzl4fP/oxX9y9eX9oxf/ydVj+5dw5PDcY+cvWVv2kbPHzh+/+A8Wzp4/vrZ5JmaBYvVkDyyf5IGFIlBgodh3AusePTg29iUgE0xMACNjyQeTFExRLDBFsY4pinVMUFQ7e+FSpidWMD1RjaUd65icAMbFxMTAcvzQhWZyn6bIfZKimKJgkmIxRcEkxQxTFOuYoFjH9EQ1pifWMTmxjsmJakxNbHf2YOwrSAMTE8CE5b4vBZMUTFKyk7NgAAAgAElEQVQUijjBFMUMUxTL2ChzHftPrGN6Yh37TqxjcqIa+02gb4QJIBJECiJFIedIwVKPZQSKdSzzWEagWEegWMfSjmXECTTFJpi7I0x04MTek4xdY1C570tBpCBSSESKMo4cXUegWEagWPfohUuJEyXEiWXEiXVMTaBPdB0gATnvS5HzfhQSJ3sU2ItigX0olrEPxTL2n1jG3hPL2HdiGXtOoAn2mtgNYWIEOf4XXgwn10jBpplsmikRKMoIFMuIEwtskLmMOLGMOLGMOLGMjTDRF8IEkDAiRV6vu0Cg4ESPMgLFAtMTy4gTC49euJRAUUKcwDbEic2YmmiPPSY6kuM+E0/s71Xefnxvf/Cf2ffPTUGum2fmvB8Fe1HMcKLHDBtlLrD/xAJ7Tyxj34kF9pxYYL8JoH+ECbSyLRBs+14hJCKEPM+2+xMqNiNS5BspCBQECgLFAoFi4eyFS4kTc8SJBeLEAnFiGRthbsYJHe0QJkby9L1zUY6ZN40FfT9P6M8gUmxGpMgrUjBFwWkeBU7yWCBQzDA9scCRogvEiQXixDLiBLpEy0GwIWJCX57Y37v4DzbLfU+K3LBhJptlFtiHYoY9KGbYHHOBfSdm2HNigc0wgX4wMYEgKX2gZ8lHmBwnKXKdopCYpGCKYoZlHjNMUMwwQTHD0o4ZJicWmJxYYGqiGss5miNMdCjFDTBTChKbECrqESnyeM2F3PejYC8KAkWBQDHD/hMs7SgUkxMECpQRJ9AFwsSEjT1On0OUqDLGaSMxKd6XuQQKaREpcg0UUp6RgikK9qEoECiYnigwPTHD9ARTE6jH1EQzyYWJbX95ZB1xuFyjxDZVvyc5xwqmKPJ4zQWmKJiiYIqCQCERKCSmJwrECeJEGVMT2FXUYaLpXxBPHHlyMnFiyhvtESXCsQxkJudIkWugkPKMFAQKAoVEoJBY3iExPSERJyTiRBlxYh1TE+GiChOHzHf+y+CU4sTUECR2xxGl+UUKpigIFLkiUMwCRe5xQmJ6Qsp7eoI4QZwAuhDUb8zsBjP7jJmdNrO3VHz/5Wb2p2Z23sxeU7r9xWb2J2Z2n5l90sxuKn3v183sr8zsE/N/XtzNS6rX518kY/0LOlGie+UjSnP9/c3t+NHcjx3NUXHcaM7BO/ejRjliVBwtKo4V5ThRjhEtPHpwbOxLmJyzB2NfQRxqw4SZHZZ0u6Rvk/QCSa8zsxes3O1zkt4k6TdXbn9c0ve6+wsl3SDpF8zsstL3f8TdXzz/5xMtX0MrOf9XrlW5fmgeGpEin0hRBIrcIkURKHKPFLnKOU5IBIqzFy7NPlAQJ4gTxIkZ4gTaCJmYuF7SaXe/393PSbpT0o3lO7j7A+7+SUkHK7f/B3f/y/mv/6OkL0h6didX3oHc40TOH5LHRqQgUqSOQJHra897ekJS1nFCYnqCOEGcIE6gClMT9ULCxJWSHix9fWZ+WyNmdr2ko5I+W7r5Z+ZLPH7ezEhrA8r1A/EU5b7kI5dAIeUZKQgUub72vAMF0xO5fzjP/fUTJ8DUBJobZI9QM7tC0vsk/bfuXvSiH5P09ZJeKukZkn50w2NvMbN7zezeJx7pfsIhx6mJHD/8xiTXSJHTFIWU334UOS/zIFBk/AE959ee+dIO4kTecYKpiRniBJoICRMPSbq69PVV89uCmNkJSb8n6cfd/aPF7e7+eZ95StKvabZkZI273+Hu17n7dccv7+cvdjnFidw+7MYu90iRg5ynKHKLFASKPP+izvREvh/QiRPECQDhQsLEPZKuNbNrzOyopJslnQp58vn93y/pve5+18r3rpj/r0l6taQ/b3LhXUs9TuT44TY1OS75YIoifTkHihwjBYEi09ee8fTEoxcuzTpQ5B4nwNQEwtWGCXc/L+lWSXdL+gtJv+3u95nZbWb2Kkkys5ea2RlJ3y3pnWZ23/zhr5X0cklvqjgW9DfM7FOSPiXpWZJ+utNX1kKqcSKXD7G5yTVS5CDnKYrcECjyk2uckJieyFXOcYKpCZSxAeZ25u5jX0Ow57zgmX7Tv76h95+z618SQ/5yHfKBo4sPYbl8aMXC8b39sS9hMJfunRv7Egbz9IxeqySd2EszFNdJNZDXOXHkibEvYRQnc33dhx8f+xJGc1nWr/0rY1/CaC47lOf/r5ddduipsS9hEk4OssPjeK646vMfd/fr2jz2SNcXk4ITR56M/r9gESTyVf6/feqRohzvUo8URczMJVCUA29OkaL4d09ugaKYnsgtUBTTE7kFimJyIsdA8eiFS7OOEwCwSeLNpr2x/1K4y7QEUQKFnJZ75LLUg2UeeWCJR15yXd6R69KOXJd1sKQjb+w1gTqEiS3GjhNt5PABFO3kEily2jCTQJG+nANFbnLdHJM4kRfiBHLHPhObESZqxBQnUv/Aie7kECik/KYockGgyAPTE/nI9dQO4gRyw9QEtiFMBIgpTgBN5BAnpG42ko1BTnFCCttoGIhRjnEiV7nGiVwxNQFsRpgINHScSH0jP0wHcSItucWJ3OQ2NSHluawjVzlOTeSKqQkAqwgTiNqT547oyXMcLgOU5RQncpyaIE7kgamJfDA1AQCECUSsHCQIFLthagIxyzFOAKliagKpYzkHUI0wgehsixDEifaIE2nJaWpCyi9OMDWRB6YmkDKWc+SJDTCxCWEiEbl8qAwJD0xPtJfL+4g4gRTkGCeAVLGcA8gHR4ZWI0wgGk1jA3GinVziBNKT29REjpiayAPLOQAgP4QJRKFtZGB6ApswNZGm3OJEjlMTOcYJIFW5LudgnwlgHWGigaGPDMVMF2GBONFMLlMTxAmkIMc4kRumJvLAcg7kgn0mUIUwgUnrMigwPdEMcSItOcWJ3KYmcpTj1ESOcQIAkA/CBCarr4hAnAiXS5xAenKLEzlOTeQYJ3KT49REjnJdzgFgGWECk9R3PGB6IlwOcYKpCaQgxziRG6Ym0sdyjnywzwSwjDCBSRk6GBAnUCBOpCe3qYkcMTWRPqYmAKSII0PXESZ6cGKPTTLbGCsSECfq5TA1IREnUpRbnGBqIn1MTaSPqQnkgA0wsYow0RAnc/Rj7DjA0o56ucQJIHa5xQmmJoD4sc8EgKjCxGFj5iVFUwoCBIrtcogTTE2kJ7epCaQvt6kJlnMgVewzASxEFSYk6cSRJ8a+BHRoqhGAQJE34kR6cosTTE0AcWM5B4DcRBcmJOJEKmL44B/DNQ4th6kJiTiRotziRG5yixNMTSA1LOcA8hZlmJCIE7GL6QM/0xPrcokTQMxym5oAAMSFDTBRFm2YkGZxgkARn1g/5BMoluUQJ5iaSE9uUxO5xQmmJtKW29QEyznywD4TwEzUYaJAnIhDKh/sU3gNCEecSE9ucQIAAGDqkggTEnFi6lL7MJ9KZNlVDlMTEnECcWNqIm1MTSAl7DOBnJzlwMklyYQJiTgxVSl/gCdQ5BMnkBamJgDEgOUcAHKRVJiQiBNTk8uH9lxe5yY5xAmmJtKTU5xgaiJtuU1NAADSk1yYwHTk9mE9t9e7ijiRjpziRE5yixNIV27LOXKbmshxOUfOG2ByMgcKhAn0ItcP6bm+biBWOU1N5IapCQAA4kGYQOdy/3Ce8+tnaiIdOU1N5BQnmJpAKnKbmgCA1BEm0Bk2goREnEhJTnEiJznFidymJpCu3JZzAMhPUJgwsxvM7DNmdtrM3lLx/Zeb2Z+a2Xkze83K995oZn85/+eNpdtfYmafmj/nL5mZ7f5yhnHiyJNjX8LkECSW5f77QZxAbHKamkC6WM6BVLDPBJCf2jBhZocl3S7p2yS9QNLrzOwFK3f7nKQ3SfrNlcc+Q9JPSHqZpOsl/YSZXT7/9q9I+j5J187/uaH1q8Cocv8Qvgm/L0hBTlMTOcUJpiaQApZzAEA6QiYmrpd02t3vd/dzku6UdGP5Du7+gLt/UtLBymO/VdLvu/vD7v6IpN+XdIOZXSHphLt/1N1d0nslvXrXF1PI7cjQMf/rNB++t8v594epiXTkFCeQppziBFMT6WI5B1LFyRyQwsLElZIeLH19Zn5biE2PvXL+6zbPiYnI+UN3Ezn/PhEn0pFLnGBqAogLUxPpynE5B5CzyW9+aWa3mNm9Znbv4488NfblAK3kHCeA2OQUJ3LC1AQAANMVEiYeknR16eur5reF2PTYh+a/rn1Od7/D3a9z9+suvZwxH8TpkqPnx76EURzf2x/7Enp36d65sS9hEE/P5HVK0ok9NjhOUU7LPE/m9FoPPz72JQAAOhASJu6RdK2ZXWNmRyXdLOlU4PPfLemVZnb5fNPLV0q6290/L+kxM/um+Wkc3yvpd1tc/yiGGH+NYTw81w/bTVxy9Hy2v09EiXQQJdKU0wlTOUUJIBWXHf7K2JcAYEC1YcLdz0u6VbPI8BeSftvd7zOz28zsVZJkZi81szOSvlvSO83svvljH5b0U5rFjXsk3Ta/TZJ+UNK7JJ2W9FlJH+r0lWUihzX8sco1SEhECcQppyiBdOU0LZGby5gOQaIuO8RyfUhBC9/d/YOSPrhy21tLv75Hy0szyvd7j6T3VNx+r6RvaHKxoXJaR4ppIkogFTlNS+SEaQmkgGUcAJCOyW9+iWnL+QP4Jjn/nuQSJXKZlsgpSuQ0LZFTlMgN0xJIRY7LOC47xP//Im8cFdADdnTPU85BQiJKpIYogRQwLZGu3KYlWMYBIHVMTGBnuX8gl/g9IEqkJacokRumJdLFtAQAxOUkn8SX8NsB7IgoQZRAvHKalsgtSjAtgVQwLQEgB4QJdCLHD+c5HwVaIEqkJ6dpiZyiRG5yixK5TUvktowjN+wvkRdO5ECBMDGCL+8fHfsSepHTh/ScXusmRIn0ECXSldu0BAAAiAubXwINECRmiBLpySlKIG1MS6Qtt2kJlnEAyAUTEw09dp4TN7ZJ+YN7yq+tCaJEenKLEkxLAMA05biMA8BMchMTj50/PvYlIDEEiQWiBGJHlEgb0xJpy21aAnnIeX8JoIyJCXQupQ/yKb2WXREl0pTbtAQAxIJlHEgdG1+iLLmJCaALBImFXIKERJRIHdMSaWNaAgCAeDExgV7E/ME+5mvvGlEiXUSJtBElkBqWcaSP/SWQk5N8Cl/DxEQDbHyZNoLEMqJEuogSQNyYlkgfyzgA5IZW07HH9okXhZg+6Md0rUPIKUoAqWFaAqlhWgKpYuNLYIGJCWSNILEutyjBtETacpuWyC1K5IhpCaSIZRwAmJhAr6b8wX/K1zYWokTaiBJIDdMSSBHLOJADTuTAKiYmArG/RDoIEtWIEmnLLUrkiGmJ9OU4LcEyDgDIQ1ITE4+dPz72JaDClELAlK5lSogSacsxSuQ2LZFjlGBaAgCAdDAxgUEUQeDJc+O85QgSmxEl0kaUANLAtEQeclzGkev+Emx8CSwjTGBQq4FgiFBBlNiMKIHU5BglmJYAAACxI0wEYH+J/pSjQdeRgiCxHVEifTlOSyB9OUaJHKclAAB5IUxgMrqapiBI1CNKpC/HKMG0BJAOlnEAQF4IExF7Yn9v7EvoVZtQQZSoR5RIH1EiDzlGCaYlgLSwv0Secj8q9GRSx090J5kwwYkc6du27IMgUS+3ICERJXKRY5QAUpbjtAQA5C6ZMIG8ECKaIUrkIccokSumJfLAtEQ+WMYBIHcMktRg40vEjiiBlOU4LZFjlEA+mJbIR67LOABUI0wACSNK5CPHaYkco0SucpyWQD6YlgAAwgSQLKJEPogS+WBaIh8s4wDSlPvGl8AmSYQJNr4ElhEl8pFjlMhVrlEix2mJXKMEyziA9OV+Igc2Y/PLLaa+v8Txvf3kjwxFOGJEPnKNEUxJ5CXHICERJXKS8xKOXPeXYFoC2Cz6MDGlaYnH9utDxpf3j9be5/GA+wA5hgiJGJEjgkReCBJ5yTFISEQJ5IlpCelkEusV+hF9mOjL1KclkCdiRH5yDRK5xgiJIJEjokReiBJ5YloC2C7qMNHXtARRAlNCjMhPrjFCIkjkKtcoQZDID1EiT0QJpiUkpiXqBP32mNkNZvYZMzttZm+p+P4xM/ut+fc/ZmbPm9/+BjP7ROmfAzN78fx7H5k/Z/G95zS58Ckt4QjFMg6EOL63v/RPbi7dO5dtlHj63rlso8SJvSezjRInjjyZbZQ4ceSJLKPEySNPECUyRJTIE1GCKIEwtRMTZnZY0u2SXiHpjKR7zOyUu3+6dLc3S3rE3Z9vZjdLeoekm9z9NyT9xvx5/rakD7j7J0qPe4O739vRa+lE22mJkP0lgE1yDBBluYYIiemInOUaIyQmJHJEkMgXUQJAiJClHNdLOu3u90uSmd0p6UZJ5TBxo6S3zX99l6RfNjNzdy/d53WS7tz5isUSDsQv9xAhESNyRpDI9/UTJPJElMhXzlECM0xLzLCMo15ImLhS0oOlr89Ietmm+7j7eTM7K+mZkr5Yus9NmgWMsl8zswuSfkfST6+EjEoxLuEAJGKElHeMkAgSOQcJYkS+co4SOQcJiSiRe5RgWgJoZpDNL83sZZIed/c/L938Bnd/yMy+SrMw8T2S3lvx2Fsk3SJJJ67oL0rsMi3BMaHYhBhBjCBG5PuBXCJI5CznICERJYgSRAkwLYFmQsLEQ5KuLn191fy2qvucMbMjkk5K+lLp+zdL+jflB7j7Q/P//U9m9puaLRlZCxPufoekOyTpOS94Zu1ERRss4UBXCBEzxIi8Xz8xIvfXn/dfyAkSuX8gz/v1S0QJosQMUWKBZRxhQsLEPZKuNbNrNAsQN0t6/cp9Tkl6o6Q/kfQaSR8ulmWY2SFJr5X0d4s7z+PFZe7+RTPbk/QPJf3Bjq8FGAUxghAhESMkggRBgr+MEyXy/lBOlCBKAGivNkzM94y4VdLdkg5Leo+732dmt0m6191PSXq3pPeZ2WlJD2sWLwovl/RgsXnm3DFJd8+jxGHNosSvdvKKGmJaAm0QI4gREjFCIkZIBAmCBEEi9yAhESUkooTEtESBaQm0EbTHhLt/UNIHV257a+nXT0r67g2P/Yikb1q57SuSXtLwWjvXRZRgf4k8ECIIEQViBDFCIkZIBAmJICERJSSihESUkIgSqMYyjnCDbH6J/hzf29cT+3tjX0aSiBHECIkQUSBGzBAkCBISQUIiSEgEiQJRgihRxrQE2so2TLCEA1WIEcSIAkFihiAxQ5AgSBSIEkQJiShRIEoQJcqIEthFlmFiilHi0r1zLOcYASGCEFFGjJghRiwQJAgSBYIEQaJAlJghSgDbsYyjmSzDRFe62l8CwyFEzBAjFogRCwSJGWLEDEFihiAxQ5SYIUrMECVmmJZYYFoCu8ouTExxWgL9IUQsECMWiBELxIgFgsQCUWKGKDFDlCBIlBElZogS2IZpieayChNEifQRIpYRIxaIEcsIEgsEiQWCxAxBYoYgMUOUWCBKzBAlljEtgS5kFSa6xDKOaSBErCNGLCNILBAjlhEkFggSMwSJBaLEDFFigSiBKkQJdCWbMMG0RBoIEdWIEcuIEcsIEssIEgsEiRmCxAJBYoEosUCUWGBaAnVYxtFOFmGCKBE3YsQ6QsQyQsQ6YsQyYsQygsQCUWKBKLFAlFggSiwQJZYxLYEuZREmEBdCRDVixDJixDpixDqCxAIxYhlBYoEgsUCQWCBILCNKAP1KPkz0MS3B/hLdIkRUI0SsI0asI0asI0YsI0gsI0gsECSWESUWiBLLiBLrmJaoxjKO9pIOEyzhmCZCxGbEiGWEiGrEiHXEiHUEiWUEiWVEiQWCxDKixDKixDqiBPqQdJjAdBAjNiNGLCNGVCNGVCNIrCNILCNILCNILCNKLCNKLCNKAMNJNkz0NS0RsoxjaMf39vXE/t4gP6dOcR2EiM0IEeuIEdWIEdWIEeuIEesIEssIEssIEuuIEgjBtMRmLOPYTZJhgiUczXUVEggS1YgRywgRmxEjNiNIrCNIrCNIrCNKLCNKrCNKrGNaAhhWkmGiL1OclghBLBgeIWIdMWI7gkQ1YkQ1gsQ6gsQ6gsQ6osQ6osQ6okQ1piXQp+TCRE5LOMqID+MjRqwjRmxHjNiMIFGNILGOILGOILGOILGOIFGNKFGNKLEdyzh2l1SYYAkHhkaMWEeM2I4YsRkxohoxohpBYh1BohpRYh1RohpRAhhPUmGiL1OflsBwCBHrCBH1iBGbESM2I0hUI0hUI0qsI0hUI0pUI0psxrQEhpBMmMh1CQf6R4xYR4yoR4zYjiCxGUGiGkGiGkGiGlGiGlGiGlFiM6JEPZZxdCOJMMESDnSFCLGOCFGPCFGPELEdMaIaMWIzgkQ1gkQ1gsRmRInNiBIYUvRhos8owbRE2ogQywgQYYgQ9YgQ9QgRmxEjNiNGbEaQqEaQ2I4osRlRIgzTEt2JOkxMdfnGl/ePNn7M4y0egzAEiGUEiDAEiHCEiO2IENsRIrYjRmxGjNiMILEdQWI7okQYokS3ogwTqU1JECW6Q4RYIECEI0KEI0LUI0TUI0ZsR4zYjiCxGUFiO4JEPaJEGKJE96ILE1Odkii0mZZAO0SIGQJEM0SIcESIMISIeoSIesSI7YgR2xEk6hEl6hElwhAl+hFVmDhw6+V5x9xLgmmJ5nINEgSIZggQzRAhwhEi6hEi6hEiwhAktiNI1CNIhCFKYGxRhYmudR0kmJboT04xggARjvjQHiEiHCGiHiEiDDEiDDGiHkEiDFGiHkGiGaYl+pNtmJjCiRtMS1TLJUIQIMIRIHZDhAhHhAhHjKhHiAhHjAhDkAhDkAhDlGiGKNGvLMNEH1GCaYl2cogQBIhmiBDtESCaI0SEI0SEIUaEI0aEI0iEI0qEIUo0Q5ToX1ZhYgpTEoUcpyWIECgjQLRHgGiPEBGOEBGOGBGOGNEMQSIcQSIcUaIZosQwsgkTfUYJpiXWpR4hCBDhCBC7IUK0R4RojhgRjhgRjhjRHEGiGaJEOKIEpir5MNH3lESbKJHatAQRAhIBogtEiHYIEO0RIpohRoQjRrRDkGiGINEMUaI5piWGk3SYmNLSjUIqUSLFGEGA2I7w0C0iRDtEiN0QIpojRjRDkGiOGNEcQaIZgkQ7RIlhBYUJM7tB0i9KOizpXe7+9pXvH5P0XkkvkfQlSTe5+wNm9jxJfyHpM/O7ftTdv3/+mJdI+nVJxyV9UNL/4O6+4+uRNFyQyHUJR+xRggCxGfGhH0SI9ggR7REh2iNGNEOMaI4Y0R5RohmiRDtEieHVhgkzOyzpdkmvkHRG0j1mdsrdP12625slPeLuzzezmyW9Q9JN8+991t1fXPHUvyLp+yR9TLMwcYOkD7V+JXNTnJIoxD4tEWOQIEJUI0B0j/jQDUJEO0SI3RAimiNGtEOQaI8g0RxRoh2ixDhCJiaul3Ta3e+XJDO7U9KNksph4kZJb5v/+i5Jv2xmtukJzewKSSfc/aPzr98r6dXaMUwMGSVym5aYepQgQFQjQHSL+NAtIkR7hIjdESPaIUg0R4zYHVGiOaIEYhMSJq6U9GDp6zOSXrbpPu5+3szOSnrm/HvXmNmfSXpM0j939z+e3//MynNe2fzyZ6Y8JVGIdVpiykGCGLFAgOgO8aE/hIj2CBG7I0S0R4xohyCxO4JEO0SJ9piWGE/fm19+XtJ/7u5fmu8p8QEze2GTJzCzWyTdIklP++qnrX1/jCiRy7TEFKNEzjGC+NA9IkQ/CBC7I0TshgixO2JEewSJ3REk2iNKtEeUGFdImHhI0tWlr6+a31Z1nzNmdkTSSUlfmm9m+ZQkufvHzeyzkr52fv+rap5T88fdIekOSXrW33rWxc0xx5qSyOF40KkFiZxiBPGhP0SI7hEgukOI2A0hojsEiXaIEd0gSOyGKNEeUWJ8IWHiHknXmtk1msWDmyW9fuU+pyS9UdKfSHqNpA+7u5vZsyU97O4XzOxvSLpW0v3u/rCZPWZm36TZ5pffK+lfhl40UxL9mVKUSDlIECD6Q4DoHgGie4SI3RAiukOI2A1BohsEid0QJHZDlJiG2jAx3zPiVkl3a3Zc6Hvc/T4zu03Sve5+StK7Jb3PzE5LelizeCFJL5d0m5ntSzqQ9P3u/vD8ez+oxXGhH1LAxpcX/FB0USKmaYkpRInUYgQBonuEh/4QIPpDiNgdMaI7xIjdESS6QZDYHVECqbDZaos4XP71z/Fvefd3D/bzdp2SiCVKjB0kUogRBIjuEB6GQ4joHgGiO4SI7hAiukOQ6AZBohtEid0xLdGtK676/Mfd/bo2j+1788so5bJsQxo3SsQaJIgQuyM+DI8I0T0iRPeIEd0hRnSHGNEdgkR3iBK7I0pMC2GipMsgMfVpibGCREwxggCxOwLE8AgQ/SBC9IMQ0R1CRPcIEt0hSHSLKLE7osT0ECbmmJLoTwwxggixGwLEsIgP/SJC9IcQ0S1iRD8IEt0hSHSLINENosQ0ZR8m+ggSU56WGDJKTDFIECDaITyMgwAxDEJEfwgR3SJE9IcY0S2CRPeIEkhdtmGizwmJ4sP/lAJF30GCCBE3wsN4iA/DIkL0hwjRD2JEf4gR3SNI9IMo0R2mJaYruzAx5JKNqQSKPqLElEIEAaIe4WF8BIjhESH6RYjoDzGiP8SIfhAk+kGQ6BZRYtqyCRNj7iFx6d65UeJEX1MSU4gSxIhqBIhpIEIMjwjRLyJE/4gR/SFG9Icg0R+iRLeIEtOXRZiYwsaWQ09PpDglQYyYIT5MA/FhHASIYRAi+keI6Bcxol8Eif4QJLpHlIhD0mFiCkFiVd+BIsUpiRyDBPFhfISH8REhhkOIGAYxol/EiP4RJPpFlEDOkgwTUwwSq/oIFClFiRxiBPFhfMSHaSBADI8QMQxCRP+IEcMgSPSLINEfpiXikVSYiCFIrOoqUKSwdCPFGEF8GB/xYToIEOMgQgyHEDEcgsQwCBL9I0r0hygRl2TCRMnIU3YAABL4SURBVIxRoqztBpmxB4kUYgTxYVyEh+khQIyHCDEsQsRwCBHDIUYMgyDRL6JEfKIOE7HHiLImUSLmGBFbiCA6jIPYMF1Eh3ERHsZBgBgWEWJYhIhhEST6R5SIU1Rh4oJbEjFil2UbXUaJIWLE1EME4WEYhIY4EB3GR3gYD/FheASIcRAihkeMGAZBIm5RhYlYDXVEaJ2+Q8TUIgTRoR9EhvgQHKaF+DAe4sN4iBDjIUSMgxgxHIJEGggTFapCQuikQp8Ros20RJ8xYuwQQXjoDrEhPsSG6SE4TAPxYXxEiHERIsZDjBgeUSIdWYeJJhHh8f2ja2FgyEmIJlGijxhBhIgLoSFeBIfpIjxMB/FhGggQ00CIGBcxYhwEifRkEya6iAhjLcmoixJ9TUWMFSOIEAsEhnQQHKaP8DA9BIjpIEJMByFiGggSwyNGpC25MDGV/Rz6ltJURI4hguAQNyJDnAgP00R8mBYCxLQQIaaFGDEOgkQeog0TuQSIqmmJLqPEGDEi5RBBcIgXsSFOxIbpIjhME+FhmggQ00OEGB9BIi9RhYkDt2yChNRflBgyRsQaIQgM6SA4xIvoMH3Eh+kiQEwTAWKaiBDTQpDIU1RhIiddRglCxDKiQ1wIC2kiOsSB8DB9BIhpI0RMFzFieggSeSNMTFAXUWKoGDHFEEF4mD5iQ5qIDXEiPsSBADF9RIjpI0ZME0ECUsZh4on9vaWvj+/tj3Ql3RgiREwpQhAfxkdcyAOxIV4EhzgRIOJAhIgHMWK6CBIoSz5MrAaIbfebQpxoMi3RZ4yYSoQgQPSLuJA3okO8iA7xIjzEiRARD0LE9BEkUCWZMBEaIOqeY8w4ERolug4SU4gQBIhuEBryRmhIB+EhPgSHdBAh4kOMiAdRAptEFya6CBB1zz9GnBg6SowZI4gQy4gJqEJkSBvhIV4EiPgRHtJAjIgLQQJ1ogoTB26D/JyxJyc22SVKECKGR3BAFYJDuogNaSFAxIvwkC5iRHwIEggVVZgY0pBxosujQcvGihEphQjiAqoQF/JBbEgb8SF+RIh0ESHiRpBAU4SJLYaIE10v4Rg6RsQUIYgMWEVgAOEhPcSGdBEh0kSASAtBAm0RJmr0GSe6iBKEiAXCAyRiA4gNKSM65IMIkR4CRNoIEthV0mHiyXOLl3fJ0fOtn6dNnFjdpDPk8aFRYqgYMcUIQXxIDyEB2xAZ8kN8yAfxIV1EiHwQJNCVJMJEOUBsu0+fcWLbaSFVj6ualgjRV5SYWoQgQMSL0IBQRId8ER/SR3TICyEiT0QJdCkoTJjZDZJ+UdJhSe9y97evfP+YpPdKeomkL0m6yd0fMLNXSHq7pKOSzkn6EXf/8PwxH5F0haTi31yvdPcvbLsOdwuKEJt0FSeaHFkaGiX6PBp07Xkn9KGfADEO4gH6QmzIE6EhP4QHECPyRIxAX2o/5ZvZYUm3S3qFpDOS7jGzU+7+6dLd3izpEXd/vpndLOkdkm6S9EVJ3+Hu/9HMvkHS3ZKuLD3uDe5+b0evJUgXcSJU11Gi7bTEFEIEAaI/RAZ0jbiAAsEBBAgUCBF5IkRgKCHjB9dLOu3u90uSmd0p6UZJ5TBxo6S3zX99l6RfNjNz9z8r3ec+ScfN7Ji7j/on265xokt9RImxQwQRYh3xAFNAcMAqwgPKiBAoECHyRozAGELCxJWSHix9fUbSyzbdx93Pm9lZSc/UbGKi8F2S/nQlSvyamV2Q9DuSftrdveH1t9Z3nBhyXwlCxPAIDRgLcQEhCA5YRXTAKuIDyogR2MXJQ8d2fo5BNr80sxdqtrzjlaWb3+DuD5nZV2kWJr5Hs30qVh97i6RbJOnIs092el19xYkh9pUYK0bEHCGICZgK4gKaIjRgE4ID6hAgsAkxArvqIkgUQsLEQ5KuLn191fy2qvucMbMjkk5qtgmmzOwqSe+X9L3u/tniAe7+0Px//5OZ/aZmS0bWwoS73yHpDkk6/vzndj5R0XWcGGJfiSGjxNRDBLEBYyIwYFcEB2xDdEAo4gNCECLQlS6DRCEkTNwj6Vozu0azAHGzpNev3OeUpDdK+hNJr5H0YXd3M7tM0u9Jeou7/7vizvN4cZm7f9HM9iT9Q0l/0OYF7O8f0d7ebmGhz2UdMUWJKUcIAgS6RFBAn4gNaIoAgVAECDRFjECX+ggShdowMd8z4lbNTtQ4LOk97n6fmd0m6V53PyXp3ZLeZ2anJT2sWbyQpFslPV/SW83srfPbXinpK5LunkeJw5pFiV+tvxbT/v76JXcRJ7pQNS0RYowoMdUIQYBACMIChkJkwC4IDtgVIQJtECPQtT6DRMEG3G9yZ5f8zSv96rf/wMbv7xondpma6HsJxy5RYooRggCRDyICpobYgF0RHNAl4gN2RYhAX5oGiUuf+8DH3f26Nj9rkM0vh7Lr5ETbJR1D7CsRamoRggARFyICYkNkQJcIDugL8QFdI0agT0NMSKxKKkxI48WJsiH3lZhKiCBADId4gBQRGNA3ogP6RnzAEAgS6NMYQaKQXJiQho0TIftKdB0lxo4RRIhqBAOAwIBhERswNOIDhkaIwBDGDBKFJMOENEycCF3CEWKKUSLVAEFAADYjLGBsxAaMifCAsREiMLQpRAkp4TAh6eIJHm0DxZPnFr89q5Giy30lxo4SMQUIogKwjJCAKSMyYGoID5giYgTGMpUoIUUWJtyt1ePKR4x2caxo15tdrt2npygRQ4AgPCB1hATEjNCAqSM8IAaECEzBlKKEFFmYkKTz5w5f/PWRoxcaP37XSDHGCRxNo8SUAwThAVNFMEBuiAyIFfEBMSJGYEqmFiWkCMNEWREp2gQKKTxSbNtrou8TOLZFiakGCOIDdkEgAOoRFZAywgNSQIjAVE0xSkiRh4nCrlMUUth+FKvTEkMeC1o2ZpAgOqSHEACMh8CA1BEZkBNiBKZuqlFCSiRMlHW11KMIFJumJYaIElXTEkNECeJDd/jQD6SFkAAsEB0AYgTiMeUoISUYJsraRoqqqYnytEQqUSL1AEEUAFCFuACEITwA6wgRiNHUo4QUW5jw9g9tsx9F1bREjFEipgBBTABAOAB2R1QAmiE4IFUxRAkptjAhyfcXf2rY3kHjx9dNUdRNS6yaUpSIIUAQHoA4EQuAaSA4ALsjQiAXsUQJKcIwUVZEijaBQtoeKUKmJcaKElMPEMQHoB/EASBtRAegH4QI5CimKCFFHiYKu05RbFvesWlaItcoQXRAjpoGgUcPjrd6HIB4EBGA6SJEIHexRQkpkTBRtkuk2HZUaNXeEmUpRAmiA8aQ4of3FF8TkANiAxAfIgSwLMYoISUYJspCIkXVtESxjKPJtMSqKUcJAsTw+KAKALsjHAAgRACbxRolpNjCRLutJCTV70cROi0RsoRjCkeC5hAf+LAPAPEjNgB5IzQA3Yg5SkixhQlJOlf60+to81Lh+4cuxolt0xJVQveVWLvPjlFi27REbAGCmAAA00csANAFogMwjNijhBRjmCjbMVIUth0Rum1vidB9JVZVRYlNqqLElGME4QEAukMgABADAgQwnhSihBR7mCgrIkVNoOhqWmKXzS6rhO4rMXaUIDwAyAVRAADWESEA9CGdMFFoOEWxbVpik7FO4Og7ShAdAIyNGAAAwyM2AHFKZVpCSjFMlK1MUWw7PrRqWqJqGUesUYLoAKCMAAAA6SAsAIhdXGHCrfljKqYmqpZxFKqmJYplHDFECQLE9G36QPjowXDFs+5DaZ/X0tUH4tBr5AM4ACAVBAgAhZSmJaTYwoQkKy3V8AYbXlZNSxTLOEKnJVaNGSVSDBC5f4Cc0uuf0rVsEsM1AgAgERQAoE50YaKsNlJ0OC2xiihRjQ+LAAAgVQQGAFOQ2rSEFHmYKCsiRVWg2DYtUaVub4mcowThAQAAxIqwAADTlEyYCLHtiNDQaYkhosQmfUcJogMAAJgSQgIALEtxWkJKOUxsOYljl2mJte/1ECWqpiV2iRIEBwAA0AZhAACmI9UoIcUWJrzm21s2w9w2LVElZFpilyixSdsoQXwAACAtRAEAQC7iChOSDp1bHBl6cHRDqdgSKKqmJaqWcRQ2TUvsGiVC95WoihJECAAAukUEAABMWcrTElKEYaLs0Dm7GCdCN70sbDsitG5aIjRKbJJDlOAveGk7G3hS76b3QejjAfSHP6cBAMBURB0mKicmthwR2tW0xKpNUWKXEzimGiX4iyyk3d8HvI8AAACAMKlPS0hS0McDM7vBzD5jZqfN7C0V3z9mZr81//7HzOx5pe/92Pz2z5jZt4Y+ZxNdTktUqZuWqBJjlDh5qP4fAAAAAAC6VDsxYWaHJd0u6RWSzki6x8xOufunS3d7s6RH3P35ZnazpHdIusnMXiDpZkkvlPRcSX9gZl87f0zdcza3ZVqiyrYjQqumJbo+gWOoKEFQAAAAAID45DAtIYUt5bhe0ml3v1+SzOxOSTdKKkeEGyW9bf7ruyT9spnZ/PY73f0pSX9lZqfnz6eA51xjpZUbGze+1PYjQneZllg1hShBdAAAAAAAxCzkY+2Vkh4sfX1mflvlfdz9vKSzkp655bEhz7nGreK2hkeEblO16WVhdVqi6yjRBEsrAAAAACBtuUxLSBFsfmlmt0i6Zf7lU/f/0A/9+ZjXA2zwLElfHPsigA14f2KqeG9iqnhvYsp4f2Kqvq7tA0PCxEOSri59fdX8tqr7nDGzI5JOSvpSzWPrnlOS5O53SLpDkszsXne/LuCagUHx3sSU8f7EVPHexFTx3sSU8f7EVJnZvW0fG7IY4B5J15rZNWZ2VLPNLE+t3OeUpDfOf/0aSR92d5/ffvP81I5rJF0r6d8HPicAAAAAAEhc7cSEu583s1sl3S3psKT3uPt9ZnabpHvd/ZSkd0t633xzy4c1Cw2a3++3NdvU8rykf+LuFySp6jm7f3kAAAAAAGDKbDbYEAczu2W+tAOYFN6bmDLen5gq3puYKt6bmDLen5iqXd6bUYUJAAAAAACQFg6cBAAAAAAAo5lkmDCzG8zsM2Z22szeUvH9Y2b2W/Pvf8zMnjf8VSJHAe/Nl5vZn5rZeTN7zRjXiDwFvDf/mZl92sw+aWZ/aGZfM8Z1Ik8B78/vN7NPmdknzOz/NrMXjHGdyE/de7N0v+8yMzczTkLAYAL+7HyTmf1/8z87P2Fm/3iM60R+Qv7sNLPXzv/ueZ+Z/Wbtc05tKYeZHZb0HyS9QtIZzU7weJ27f7p0nx+U9CJ3/34zu1nSd7r7TaNcMLIR+N58nqQTkn5Y0il3v2v4K0VuAt+bf0/Sx9z9cTP7AUnfwp+bGELg+/OEuz82//WrJP2gu98wxvUiHyHvzfn9vkrS70k6KulWd299HB4QKvDPzjdJus7dbx3lIpGlwPfmtZJ+W9Lfd/dHzOw57v6Fbc87xYmJ6yWddvf73f2cpDsl3bhynxsl/av5r++S9F+bmQ14jchT7XvT3R9w909KOhjjApGtkPfmH7n74/MvPyrpqoGvEfkKeX8+VvryaZKm9V9NkKqQv3NK0k9JeoekJ4e8OGQv9P0JDC3kvfl9km5390ckqS5KSNMME1dKerD09Zn5bZX3cffzks5KeuYgV4echbw3gTE0fW++WdKHer0iYCHo/Wlm/8TMPivpZyX904GuDXmrfW+a2d+RdLW7/96QFwYo/N/t3zVfpnmXmV09zKUhcyHvza+V9LVm9u/M7KNmVjsFOcUwAQDoiZn9I0nXSfq5sa8FKHP32939b0r6UUn/fOzrAczskKR/IemHxr4WYIP/XdLz3P1Fkn5fi4lyYGxHJF0r6VskvU7Sr5rZZdseMMUw8ZCkcu27an5b5X3M7Iikk5K+NMjVIWch701gDEHvTTP7B5J+XNKr3P2pga4NaPpn552SXt3rFQEzde/Nr5L0DZI+YmYPSPomSafYABMDqf2z092/VPr3+bskvWSga0PeQv69fkaz/fb23f2vNNuT4tptTzrFMHGPpGvN7BozOyrpZkmnVu5zStIb579+jaQP+9R28USKQt6bwBhq35tm9o2S3qlZlKhd5wd0KOT9Wf7Lyn8j6S8HvD7ka+t7093Puvuz3P157v48zfbneRWbX2IgIX92XlH68lWS/mLA60O+Qj4TfUCzaQmZ2bM0W9px/7YnPdL9de7G3c+b2a2S7pZ0WNJ73P0+M7tN0r3ufkrSuyW9z8xOS3pYs98MoFch700ze6mk90u6XNJ3mNlPuvsLR7xsZCDwz82fk/R0Sf92vlfw59z9VaNdNLIR+P68dT7Rsy/pES3+4wPQm8D3JjCKwPfnP52fZHRes89EbxrtgpGNwPfm3ZJeaWaflnRB0o+4+9YVDpM7LhQAAAAAAORjiks5AAAAAABAJggTAAAAAABgNIQJAAAAAAAwGsIEAAAAAAAYDWECAAAAAACMhjABAAAAAABGQ5gAAAAAAACjIUwAAAAAAIDR/P8j3N8AqRtsOAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "plot(stress[0,1], title='$\\sigma_{xy}$')" + ] + }, + { + "cell_type": "code", + "execution_count": 476, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 476, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "plot(stress[1,1], title='$\\sigma_{yy}$')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-3/tutorials/3_solver.ipynb b/jupyter_notebooks/day-3/tutorials/3_solver.ipynb new file mode 100644 index 0000000..e954587 --- /dev/null +++ b/jupyter_notebooks/day-3/tutorials/3_solver.ipynb @@ -0,0 +1,168 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solver Design\n", + "\n", + "In addition to the standard `solve` method, FEniCS offers a powerful tool called the `LinearVariationalSolver`, which grants users the ability to finely adjust and control various parameters of the `solver`. This enhanced control allows for precise customization and optimization of the solver's behavior, leading to improved accuracy and efficiency in solving partial differential equations.\n", + "\n", + "In this tutorial you will learn how to define a Linear variational problem and modify the solver parameters.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "length, depth = 3, .300\n", + "num_ele_along_depth = 300\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))\n", + "U = VectorFunctionSpace(mesh, 'CG', 1)\n", + "dim = mesh.topology().dim()\n", + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "bc = DirichletBC(U, Constant((0,)*dim), clamped_boundary)\n", + "E, nu = 2e11, 0.3\n", + "rho, g = 7800, 9.81\n", + "lmbda = (E * nu) / ((1 + nu) * (1 - 2 * nu))\n", + "mu = E / (2 * (1 + nu))\n", + "\n", + "\n", + "def epsilon(u):\n", + " return 0.5*(grad(u) + grad(u).T)\n", + "\n", + "\n", + "def sigma(u):\n", + " return lmbda*tr(epsilon(u))*Identity(dim) + 2*mu*epsilon(u)\n", + "\n", + "\n", + "# Define variational problem\n", + "u, v = TrialFunction(U), TestFunction(U)\n", + "f = Constant((0, -rho*g))\n", + "a = inner(sigma(u), epsilon(v))*dx\n", + "L = dot(f, v)*dx\n", + "\n", + "u = Function(U)" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of degree's of freedom 1806602\n" + ] + } + ], + "source": [ + "print(\"Number of degree's of freedom {}\".format(U.dim()))" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "\n\n*** -------------------------------------------------------------------------\n*** DOLFIN encountered an error. If you are not able to resolve this issue\n*** using the information listed below, you can ask for help at\n***\n*** fenics-support@googlegroups.com\n***\n*** Remember to include the error message listed below and, if possible,\n*** include a *minimal* running example to reproduce the error.\n***\n*** -------------------------------------------------------------------------\n*** Error: Unable to successfully call PETSc function 'KSPSolve'.\n*** Reason: PETSc error code is: 76 (Error in external library).\n*** Where: This error was encountered inside /tmp/dolfin/dolfin/la/PETScKrylovSolver.cpp.\n*** Process: 0\n*** \n*** DOLFIN version: 2019.1.0\n*** Git changeset: 74d7efe1e84d65e9433fd96c50f1d278fa3e3f3f\n*** -------------------------------------------------------------------------\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Compute solution\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mu\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mU\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvector\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/dolfin/fem/solving.py\u001b[0m in \u001b[0;36msolve\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[0;31m# tolerance)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mufl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclasses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mEquation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 220\u001b[0;31m \u001b[0m_solve_varproblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 221\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0;31m# Default case, just call the wrapped C++ solve function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/dolfin/fem/solving.py\u001b[0m in \u001b[0;36m_solve_varproblem\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 245\u001b[0m \u001b[0msolver\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mLinearVariationalSolver\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mproblem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 246\u001b[0m \u001b[0msolver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msolver_parameters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 247\u001b[0;31m \u001b[0msolver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 248\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[0;31m# Solve nonlinear variational problem\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mRuntimeError\u001b[0m: \n\n*** -------------------------------------------------------------------------\n*** DOLFIN encountered an error. If you are not able to resolve this issue\n*** using the information listed below, you can ask for help at\n***\n*** fenics-support@googlegroups.com\n***\n*** Remember to include the error message listed below and, if possible,\n*** include a *minimal* running example to reproduce the error.\n***\n*** -------------------------------------------------------------------------\n*** Error: Unable to successfully call PETSc function 'KSPSolve'.\n*** Reason: PETSc error code is: 76 (Error in external library).\n*** Where: This error was encountered inside /tmp/dolfin/dolfin/la/PETScKrylovSolver.cpp.\n*** Process: 0\n*** \n*** DOLFIN version: 2019.1.0\n*** Git changeset: 74d7efe1e84d65e9433fd96c50f1d278fa3e3f3f\n*** -------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "# Compute solution\n", + "solve(a == L, u, bc)\n", + "u.vector().min()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### FEniCS' standard solve method relies on a direct solver, which proves inadequate for computing solutions in systems with degrees of freedom exceeding approximately one million. To address this limitation, iterative solvers and preconditioners become necessary alternatives to efficiently handle large-scale problems. By employing these techniques, FEniCS enables the successful computation of solutions in scenarios where the direct solver falls short, making it a valuable tool for tackling complex simulations and high-dimensional models." + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [], + "source": [ + "problem = LinearVariationalProblem(a, L, u, bc)\n", + "solver = LinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['linear_solver'] = 'cg'\n", + "prm['preconditioner'] = 'hypre_euclid'\n", + "prm['krylov_solver']['absolute_tolerance'] = 1E-5\n", + "prm['krylov_solver']['relative_tolerance'] = 1E-5\n", + "prm['krylov_solver']['maximum_iterations'] = 1000\n", + "\n", + "solver.solve()" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The minimum displacement is: -4.733e-04 m\n" + ] + } + ], + "source": [ + "print(\"The minimum displacement is: {0:6.3e} m\".format(u.vector().min()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-4/exercises/1_mooney-rivlin.ipynb b/jupyter_notebooks/day-4/exercises/1_mooney-rivlin.ipynb new file mode 100644 index 0000000..527c4c1 --- /dev/null +++ b/jupyter_notebooks/day-4/exercises/1_mooney-rivlin.ipynb @@ -0,0 +1,203 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 193, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [], + "source": [ + "# Create mesh and define function space\n", + "\n", + "length, depth = 3000, 300\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))\n", + "V = VectorFunctionSpace(mesh, \"Lagrange\", 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Mark boundary subdomians\n", + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "load_boundary = CompiledSubDomain(\"near(x[0],3000)\")\n", + "\n", + "# Define Dirichlet boundary (x = 0 or x = 1)\n", + "c = Expression((\"0.0\", \"0.0\"), degree=1)\n", + "r = Expression((\"-disp_step*t\"), disp_step=100, t=1, degree=1)\n", + "\n", + "bcl = DirichletBC(V, c, clamped_boundary)\n", + "bcr = DirichletBC(V.sub(1), r, load_boundary)\n", + "bcs = [bcl, bcr]\n", + "\n", + "# Define functions\n", + "du = TrialFunction(V) # Incremental displacement\n", + "v = TestFunction(V) # Test function\n", + "u = Function(V) # Displacement from previous iteration\n", + "B = Constant((0.0, 0.0)) # Body force per unit volume\n", + "T = Constant((0.0, 0.0)) # Traction force on the boundary\n", + "\n", + "# Kinematics\n", + "d = u.geometric_dimension()\n", + "I = Identity(d) # Identity tensor\n", + "F = I + grad(u) # Deformation gradient\n", + "C = F.T*F # Right Cauchy-Green tensor\n", + "\n", + "# Invariants of deformation tensors\n", + "Ic = tr(C)\n", + "J = det(F)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "https://iopscience.iop.org/article/10.1088/1742-6596/1741/1/012047/pdf" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Elasticity parameters\n", + "E, nu = 20, 0.4995\n", + "mu, lmbda = (E/(2*(1 + nu))), (E*nu/((1 + nu)*(1 - 2*nu)))\n", + "\n", + "\n", + "# Define the material parameters\n", + "c10 = Constant(3.47) # Mooney-Rivlin parameter C10\n", + "c01 = Constant(0.69) # Mooney-Rivlin parameter C01\n", + "D1 = Constant(0.00028)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define the Mooney-Rivlin strain-energy density function\n", + "I1 = tr(C)\n", + "I2 = 0.5 * (tr(C) ** 2 - tr(C * C))\n", + "psi= c10 * (I1 - 3) + c01 * (I2 - 3) + 1/D1* (J-1)**2\n", + "\n", + "# Stored strain energy density (compressible neo-Hookean model)\n", + "# psi = (mu/2)*(Ic - 3) - mu*ln(J) + (lmbda/2)*(ln(J))**2\n", + "\n", + "\n", + "# Total potential energy\n", + "Pi = psi*dx - dot(B, u)*dx - dot(T, u)*ds\n", + "\n", + "# Compute first variation of Pi (directional derivative about u in the direction of v)\n", + "F = derivative(Pi, u, v)\n", + "\n", + "# Compute Jacobian of F\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['maximum_iterations'] = 1000\n", + "prm['newton_solver']['linear_solver'] = 'gmres'\n", + "prm['newton_solver']['preconditioner'] = 'hypre_euclid'\n", + "prm['newton_solver']['krylov_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['maximum_iterations'] = 1000\n", + "\n", + "solver.solve()\n", + "print(\"The minimum displacement is: {0:6.3e} mm\".format(u.vector().min()))" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 215, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot solution\n", + "scale_factor = 1/2\n", + "plot(u*scale_factor, title='Displacement', mode='displacement')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-4/exercises/2_comparison.ipynb b/jupyter_notebooks/day-4/exercises/2_comparison.ipynb new file mode 100644 index 0000000..e3d409c --- /dev/null +++ b/jupyter_notebooks/day-4/exercises/2_comparison.ipynb @@ -0,0 +1,365 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Comparing linear elastic to hyper-elastic response\n", + "\n", + "In this exercise you have to compare the load-displacement response of linear elastic and hyperelastic models under the same loading condition.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from matplotlib import pyplot as plt\n", + "# Create mesh and define function space\n", + "\n", + "\n", + "def get_reaction_force(mesh):\n", + " mf = MeshFunction(\"size_t\", mesh, 1)\n", + " mf.set_all(0)\n", + " clamped_boundary.mark(mf, 1)\n", + " ds = Measure(\"ds\", subdomain_data=mf)\n", + " # Define the Neumann boundary condition for the traction vector\n", + " n = FacetNormal(mesh)\n", + " traction = dot(sigma(u), n)\n", + " # Integrate to get the traction vector\n", + " reaction = assemble(traction[1] * ds(1))\n", + " return reaction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Elastic\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def epsilon(u):\n", + " return 0.5*(grad(u) + grad(u).T)\n", + "\n", + "\n", + "def sigma(u):\n", + " return lmbda*tr(epsilon(u))*Identity(dim) + 2*mu*epsilon(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "length, depth = 3000, 300\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mark boundary subdomians\n", + "Mark the left edge as clamped_boundary and right edge as load_boundary" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "clamped_boundary = \n", + "load_boundary = " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "U = VectorFunctionSpace(mesh, 'CG', 2)\n", + "dim = mesh.topology().dim()\n", + "fixed = Expression((\"0.0\", \"0.0\"), degree=1)\n", + "load = Expression((\"-disp_step*t\"), disp_step=100, t=1, degree=1)\n", + "\n", + "bcl = DirichletBC(U, fixed, clamped_boundary)\n", + "bcr = DirichletBC(U.sub(1), load, load_boundary)\n", + "\n", + "bc = [bcl, bcr]\n", + "\n", + "E, nu = 1, 0.45" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Lame's parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lmbda = \n", + "mu =" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variational problem\n", + "u, v = TrialFunction(U), TestFunction(U)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set the body force to 0 and define the linear and bilenear forms of the linear elastic problem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "f = \n", + "a = \n", + "L = " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "u = Function(U)\n", + "problem = LinearVariationalProblem(a, L, u, bc)\n", + "solver = LinearVariationalSolver(problem)\n", + "\n", + "elastic_reaction_force = []\n", + "elastic_displacement = []\n", + "for t in range(0, 30):\n", + " load.t = t\n", + " solver.solve()\n", + " elastic_displacement.append(load.t*100)\n", + " elastic_reaction_force.append(get_reaction_force(mesh))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8, 8))\n", + "plt.plot(elastic_displacement, elastic_reaction_force)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hyperelastic\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define the material model parameter. Check day-4, tutorial-1" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "def sigma(u):\n", + " I = \n", + " F = variable(grad(u) + I)\n", + " J = \n", + " C =\n", + " I1 = \n", + " energy = \n", + " return 2 * diff(energy, F)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calling FFC just-in-time (JIT) compiler, this may take some time.\n", + "Calling FFC just-in-time (JIT) compiler, this may take some time.\n", + "Calling FFC just-in-time (JIT) compiler, this may take some time.\n" + ] + } + ], + "source": [ + "# Define functions\n", + "du = TrialFunction(U) # Incremental displacement\n", + "v = TestFunction(U) # Test function\n", + "u = Function(U) # Displacement from previous iteration\n", + "B = Constant((0.0, 0.0)) # Body force per unit volume\n", + "T = Constant((0.0, 0.0)) # Traction force on the boundary\n", + "\n", + "# Kinematics\n", + "d = u.geometric_dimension()\n", + "I = Identity(d) # Identity tensor\n", + "F = \n", + "C = \n", + "\n", + "# Invariants of deformation tensors\n", + "Ic = \n", + "J = \n", + "\n", + "# Stored strain energy density (compressible neo-Hookean model)\n", + "psi = (mu/2)*(Ic - 3) - mu*ln(J) + (lmbda/2)*(ln(J))**2\n", + "\n", + "# Total potential energy\n", + "Pi = psi*dx - dot(B, u)*dx - dot(T, u)*ds\n", + "\n", + "# Compute first variation of Pi (directional derivative about u in the direction of v)\n", + "F = derivative(Pi, u, v)\n", + "\n", + "# Compute Jacobian of F\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bc, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['maximum_iterations'] = 1000\n", + "prm['newton_solver']['linear_solver'] = 'gmres'\n", + "prm['newton_solver']['preconditioner'] = 'hypre_euclid'\n", + "prm['newton_solver']['krylov_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['maximum_iterations'] = 1000\n", + "\n", + "reaction_force = []\n", + "displacement = []\n", + "for t in range(0, 30):\n", + " load.t = t\n", + " solver.solve()\n", + " displacement.append(load.t*100)\n", + " reaction_force.append(get_reaction_force(mesh))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8, 8))\n", + "plt.plot(displacement, reaction_force)\n", + "plt.plot(elastic_displacement, elastic_reaction_force)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-4/tutorials/1_hyper_elastic.ipynb b/jupyter_notebooks/day-4/tutorials/1_hyper_elastic.ipynb new file mode 100644 index 0000000..2da72d0 --- /dev/null +++ b/jupyter_notebooks/day-4/tutorials/1_hyper_elastic.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hyperelasticity\n", + "\n", + "Linear elasticity describes the mechanical response of materials under small deformations, following Hooke's Law with a linear stress-strain relationship. It is suitable for small deformation applications.\n", + "\n", + "Hyperelasticity, on the other hand, applies to materials undergoing large deformations with nonlinear stress-strain relationships. It involves complex mathematical models to capture their behavior accurately and is used for elastomers, soft polymers, biological tissues, and applications involving significant strain without permanent deformation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Go to the following link to understand the theory behind hyperelasticity:\n", + "\n", + "https://fenicsproject.org/olddocs/dolfin/1.6.0/python/demo/documented/hyperelasticity/python/documentation.html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this tutorial we will use the Neo-Hookean model to analyze large deformation in a cantilever beam made out of rubber." + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [], + "source": [ + "# Create mesh and define function space\n", + "\n", + "length, depth = 3000, 300\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))\n", + "V = VectorFunctionSpace(mesh, \"Lagrange\", 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The minimum displacement is: -1.000e+02 mm\n" + ] + } + ], + "source": [ + "\n", + "# Mark boundary subdomians\n", + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "load_boundary = CompiledSubDomain(\"near(x[0],3000)\")\n", + "\n", + "# Define Dirichlet boundary (x = 0 or x = 1)\n", + "c = Expression((\"0.0\", \"0.0\"), degree=1)\n", + "r = Expression((\"-disp_step*t\"), disp_step=100, t=1, degree=1)\n", + "\n", + "bcl = DirichletBC(V, c, clamped_boundary)\n", + "bcr = DirichletBC(V.sub(1), r, load_boundary)\n", + "bcs = [bcl, bcr]\n", + "\n", + "# Define functions\n", + "du = TrialFunction(V) # Incremental displacement\n", + "v = TestFunction(V) # Test function\n", + "u = Function(V) # Displacement from previous iteration\n", + "B = Constant((0.0, 0.0)) # Body force per unit volume\n", + "T = Constant((0.0, 0.0)) # Traction force on the boundary\n", + "\n", + "# Kinematics\n", + "d = u.geometric_dimension()\n", + "I = Identity(d) # Identity tensor\n", + "F = I + grad(u) # Deformation gradient\n", + "C = F.T*F # Right Cauchy-Green tensor\n", + "\n", + "# Invariants of deformation tensors\n", + "Ic = tr(C)\n", + "J = det(F)\n", + "\n", + "# Elasticity parameters\n", + "E, nu = 1, 0.45\n", + "mu, lmbda = Constant(E/(2*(1 + nu))), Constant(E*nu/((1 + nu)*(1 - 2*nu)))\n", + "\n", + "# Stored strain energy density (compressible neo-Hookean model)\n", + "psi = (mu/2)*(Ic - 3) - mu*ln(J) + (lmbda/2)*(ln(J))**2\n", + "\n", + "# Total potential energy\n", + "Pi = psi*dx - dot(B, u)*dx - dot(T, u)*ds\n", + "\n", + "# Compute first variation of Pi (directional derivative about u in the direction of v)\n", + "F = derivative(Pi, u, v)\n", + "\n", + "# Compute Jacobian of F\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['maximum_iterations'] = 1000\n", + "prm['newton_solver']['linear_solver'] = 'gmres'\n", + "prm['newton_solver']['preconditioner'] = 'hypre_euclid'\n", + "prm['newton_solver']['krylov_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['maximum_iterations'] = 1000\n", + "\n", + "solver.solve()\n", + "print(\"The minimum displacement is: {0:6.3e} mm\".format(u.vector().min()))" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Calling FFC just-in-time (JIT) compiler, this may take some time.\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 186, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot solution\n", + "scale_factor = 5\n", + "plot(u*scale_factor, title='Displacement', mode='displacement')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-4/tutorials/2_load_displacement.ipynb b/jupyter_notebooks/day-4/tutorials/2_load_displacement.ipynb new file mode 100644 index 0000000..cd3832d --- /dev/null +++ b/jupyter_notebooks/day-4/tutorials/2_load_displacement.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pseudo-time analysis\n", + "\n", + "Hyperelastic materials experience substantial deformations, resulting in highly nonlinear responses. Pseudo time analysis facilitates the simulation of these significant deformations while ensuring numerical accuracy throughout the process. It addresses the inherent nonlinearity of the stress-strain relationship in hyperelastic materials." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "def sigma(u):\n", + " I = Identity(u.geometric_dimension())\n", + " F = variable(grad(u) + I)\n", + " J = det(F)\n", + " C = F.T * F\n", + " I1 = tr(C)\n", + " energy = (mu / 2) * (I1 - 2) - mu * ln(J) + (lmbda / 2) * ln(J)**2\n", + " return 2 * diff(energy, F)\n", + "\n", + "def get_reaction_force(mesh):\n", + " mf = MeshFunction(\"size_t\",mesh,1)\n", + " mf.set_all(0)\n", + " clamped_boundary.mark(mf,1)\n", + " ds = Measure(\"ds\",subdomain_data=mf)\n", + " # Define the Neumann boundary condition for the traction vector\n", + " n=FacetNormal(mesh)\n", + " traction = dot(sigma(u), n)\n", + " # Integrate to get the traction vector\n", + " reaction = assemble(traction[1] * ds(1))\n", + " return reaction" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from matplotlib import pyplot as plt\n", + "# Create mesh and define function space\n", + "\n", + "length, depth = 3000, 300\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))\n", + "V = VectorFunctionSpace(mesh, \"Lagrange\", 1)\n", + "\n", + "# Mark boundary subdomians\n", + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "disp_boundary = CompiledSubDomain(\"near(x[0],3000)\")\n", + "\n", + "# Define Dirichlet boundary (x = 0 or x = 1)\n", + "fixed = Expression((\"0.0\", \"0.0\"), degree=1)\n", + "disp = Expression((\"-disp_step*t\"), disp_step=100, t=1, degree=1)\n", + "\n", + "bcl = DirichletBC(V, fixed, clamped_boundary)\n", + "bcr = DirichletBC(V.sub(1), disp, disp_boundary)\n", + "bcs = [bcl, bcr]\n", + "\n", + "# Define functions\n", + "du = TrialFunction(V) # Incremental displacement\n", + "v = TestFunction(V) # Test function\n", + "u = Function(V) # Displacement from previous iteration\n", + "B = Constant((0.0, 0.0)) # Body force per unit volume\n", + "T = Constant((0.0, 0.0)) # Traction force on the boundary\n", + "\n", + "# Kinematics\n", + "d = u.geometric_dimension()\n", + "I = Identity(d) # Identity tensor\n", + "F = I + grad(u) # Deformation gradient\n", + "C = F.T*F # Right Cauchy-Green tensor\n", + "\n", + "# Invariants of deformation tensors\n", + "Ic = tr(C)\n", + "J = det(F)\n", + "\n", + "# Elasticity parameters\n", + "E, nu = 1, 0.45\n", + "mu, lmbda = Constant(E/(2*(1 + nu))), Constant(E*nu/((1 + nu)*(1 - 2*nu)))\n", + "\n", + "# Stored strain energy density (compressible neo-Hookean model)\n", + "psi = (mu/2)*(Ic - 3) - mu*ln(J) + (lmbda/2)*(ln(J))**2\n", + "\n", + "# Total potential energy\n", + "Pi = psi*dx - dot(B, u)*dx - dot(T, u)*ds\n", + "\n", + "# Compute first variation of Pi (directional derivative about u in the direction of v)\n", + "F = derivative(Pi, u, v)\n", + "\n", + "# Compute Jacobian of F\n", + "J = derivative(F, u, du)\n", + "\n", + "# Compute solution\n", + "problem = NonlinearVariationalProblem(F, u, bcs, J)\n", + "solver = NonlinearVariationalSolver(problem)\n", + "\n", + "prm = solver.parameters\n", + "prm['newton_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['maximum_iterations'] = 1000\n", + "prm['newton_solver']['linear_solver'] = 'gmres'\n", + "prm['newton_solver']['preconditioner'] = 'hypre_euclid'\n", + "prm['newton_solver']['krylov_solver']['absolute_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['relative_tolerance'] = 1E-7\n", + "prm['newton_solver']['krylov_solver']['maximum_iterations'] = 1000\n", + "\n", + "reaction_force = []\n", + "displacement = []\n", + "for t in range(0,30):\n", + " disp.t = t\n", + " solver.solve()\n", + " displacement.append(disp.t*100)\n", + " reaction_force.append(get_reaction_force(mesh))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8, 8))\n", + "plt.plot(displacement,reaction_force)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot solution\n", + "scale_factor = 1/10\n", + "plot(u*scale_factor, title='Displacement', mode='displacement')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-5/exercises/1_bi_metallic_quasi_static.ipynb b/jupyter_notebooks/day-5/exercises/1_bi_metallic_quasi_static.ipynb new file mode 100644 index 0000000..d1d0ff3 --- /dev/null +++ b/jupyter_notebooks/day-5/exercises/1_bi_metallic_quasi_static.ipynb @@ -0,0 +1,105 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise: Bimetallic Quasi-Static Thermal Simulation using Steel and Brass Unit Square using FEniCS**\n", + "\n", + "In this exercise, you will perform a bimetallic quasi-static thermal simulation using the Finite Element Method (FEM) with FEniCS. The simulation will involve a unit square made of two different materials: steel and brass. The goal is to analyze the steady-state temperature distribution within the square and observe the thermal behavior at the interface of the two materials. |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "**Materials:**\n", + "\n", + "The following table provides the material properties for steel and brass:\n", + "\n", + "| Material | Thermal Conductivity (k) [W/mK] | Specific Heat Capacity (Cp) [J/kgK] | Density (ρ) [kg/m³] |\n", + "|----------|-----------------------------|-----------------------------------|--------------------|\n", + "| Steel | 50.2 | 486.0 | 7850 |\n", + "| Brass | 109.0 | 377.0 | 8520 |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "**Task:**\n", + "\n", + "1. **Geometry and Mesh Generation:**\n", + " - Create a unit square with side length L = 1.0 units (you can choose any unit system).\n", + " - Divide the square into a suitable number of elements to create a mesh. You can start with a relatively coarse mesh and later refine it to observe its effect on the simulation results.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "2. **Setting up the Problem:**\n", + " - Define the governing equation for steady-state heat conduction in 2D. The equation involves the Laplace operator and accounts for the material properties.\n", + " - Implement appropriate boundary conditions for the simulation. Specify the temperature boundary condition for all four sides of the unit square. You can use Dirichlet boundary conditions, where you set the temperature values at the boundaries.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "3. **Material Properties:**\n", + " - Use the provided material properties for steel and brass.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "4. **Thermal Simulation:**\n", + " - Assemble the finite element problem using FEniCS and solve the system of equations to obtain the temperature distribution within the unit square.\n", + " - Perform the simulation for different time steps to observe the quasi-static behavior of the system. You can use a small time step for better accuracy.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "5. **Post-Processing and Analysis:**\n", + " - Visualize the temperature distribution using contour plots or color maps.\n", + " - Analyze the temperature distribution at the interface between steel and brass. Observe if there are any significant temperature gradients or discontinuities at this interface.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "6. **Mesh Refinement:**\n", + " - Re-run the simulation with a refined mesh (i.e., more elements) and compare the results with the coarser mesh. Discuss the differences and the effect of mesh refinement on the accuracy of the simulation.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "7. **Discussion and Conclusion:**\n", + " - Write a summary of your findings, including observations about the temperature distribution, behavior at the interface of the two materials, and the influence of mesh refinement on the simulation results.\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-5/exercises/2_thermo_mechanical_transient.ipynb b/jupyter_notebooks/day-5/exercises/2_thermo_mechanical_transient.ipynb new file mode 100644 index 0000000..9565692 --- /dev/null +++ b/jupyter_notebooks/day-5/exercises/2_thermo_mechanical_transient.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Thermo-Mechanical Transient Simulation using FEniCS**\n", + "\n", + "**Objective:**\n", + "The objective of this exercise is to perform a thermo-mechanical transient simulation using the FEniCS finite element library. In this exercise, we will explore the coupling between thermal and mechanical phenomena in a time-dependent setting. The problem involves a 2D domain, and we will consider a linear elastic material model.\n", + "\n", + "**Problem Description:**\n", + "Consider a 2D square domain Ω with dimensions LxL, where L = 1.0 m. The domain is initially at room temperature T_initial = 25°C. At t = 0, the left boundary (x = 0) is subjected to a temperature of T_boundary = 100°C, while the right boundary (x = L) is maintained at T_boundary = 50°C. The top (y = L) and bottom (y = 0) boundaries are assumed to be insulated, i.e., there is no heat flux through these boundaries.\n", + "\n", + "The material properties are given in the following table:\n", + "\n", + "| Property | Symbol | Value | \n", + "|------------------|----------|---------------------------|\n", + "| Young's modulus | E | 210e9 Pa | \n", + "| Poisson's ratio | ν | 0.3 | \n", + "| Thermal expansion| α | 1.2e-5 1/°C | \n", + "| Conductivity | k | 50 W/(m°C) | \n", + "| Density | ρ | 7800 kg/m³ | \n", + "| Specific heat | c | 480 J/(kg°C) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "**Tasks:**\n", + "1. Set up the 2D square domain Ω and define appropriate mesh resolution.\n", + "2. Implement a function to compute the temperature distribution within the domain over time using the heat equation.\n", + "3. Implement a function to compute the displacement field within the domain over time using the linear elasticity equations.\n", + "4. Perform a transient simulation, coupling the heat equation and linear elasticity equations, to obtain the temperature and displacement fields at different time steps.\n", + "5. Visualize the temperature and displacement fields at various time steps using appropriate visualization tools.\n", + "6. Analyze the results and observe the temperature and displacement evolution within the domain over time.\n", + "\n", + "**Boundary Conditions:**\n", + "- Initial condition: T(x, y, 0) = T_initial for all points (x, y) within Ω.\n", + "- Left boundary condition: T(x = 0, y, t) = T_boundary for all y and t > 0.\n", + "- Right boundary condition: T(x = L, y, t) = T_boundary for all y and t > 0.\n", + "- Top and bottom boundary conditions: ∂T/∂y = 0 (insulated boundaries) for all x, t > 0.\n", + "- Displacement boundary conditions: u(x = 0, y, t) = 0 for all y and t > 0 (fixed boundary).\n", + "\n", + "**Note:**\n", + "For the simulation, you can use an appropriate time-stepping scheme (e.g., Forward Euler, Backward Euler, or Crank-Nicolson) and consider suitable time intervals to observe the transient behavior effectively. You may also choose the finite element degree and other numerical parameters based on your understanding and computational resources.\n", + "\n", + "Remember to interpret and analyze the results in light of the thermo-mechanical coupling and transient behavior exhibited by the system." + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-5/tutorials/1_thermoelasticity.ipynb b/jupyter_notebooks/day-5/tutorials/1_thermoelasticity.ipynb new file mode 100644 index 0000000..f7bfebb --- /dev/null +++ b/jupyter_notebooks/day-5/tutorials/1_thermoelasticity.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear thermoelasticity\n", + "\n", + "The temperature field is uncoupled from the mechanical fields whereas the latter depend on the temperature due to presence of thermal strains in the thermoelastic constitutive relation. This situation can be described as *weak* thermomechanical coupling.\n", + " \n", + "\n", + "## Problem position\n", + "\n", + "We consider the case of a rectangular 2D domain of dimensions $L\\times H$ fully clamped on both lateral sides and the bottom side is subjected to a uniform temperature increase of $\\Delta T = +50^{\\circ}C$ while the top and lateral boundaries remain at the initial temperature $T_0$. The geometry and boundary regions are first defined." + ] + }, + { + "cell_type": "code", + "execution_count": 346, + "metadata": { + "raw_mimetype": "text/restructuredtext" + }, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from mshr import *\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "L, H = 5, 3\n", + "mesh = RectangleMesh(Point(0., 0.), Point(L, H), 100, 10, \"crossed\")\n", + "\n", + "def lateral_sides(x, on_boundary):\n", + " return (near(x[0], 0) or near(x[0], L)) and on_boundary\n", + "def bottom(x, on_boundary):\n", + " return near(x[1], 0) and on_boundary\n", + "def top(x, on_boundary):\n", + " return near(x[1], H) and on_boundary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because of the weak coupling discussed before, the thermal and mechanical problem can be solved separately. As a result, we don't need to resort to Mixed FunctionSpaces but can just define separately both problems.\n", + "\n", + "\n", + "The temperature is solution to the following equation \n", + "$$\\text{div}(k\\nabla T) = 0$$\n", + "where $k$ is the thermal conductivity (here we have no heat source). Since $k$ is assumed to be homogeneous, it will not influence the solution. We therefore obtain a standard Poisson equation without forcing terms. Its formulation and resolution in FEniCS is quite standard with the temperature variation $\\Delta T$ as the main unknown.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 347, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "VT = FunctionSpace(mesh, \"CG\", 1)\n", + "T_, dT = TestFunction(VT), TrialFunction(VT)\n", + "Delta_T = Function(VT, name=\"Temperature increase\")\n", + "aT = dot(grad(dT), grad(T_))*dx\n", + "LT = Constant(0)*T_*dx\n", + "\n", + "bcT = [DirichletBC(VT, Constant(50.), bottom), \n", + " DirichletBC(VT, Constant(0.), top),\n", + " DirichletBC(VT, Constant(0.), lateral_sides)]\n", + "solve(aT == LT, Delta_T, bcT)\n", + "plt.figure(figsize=(18, 8))\n", + "p = plot(Delta_T)\n", + "plt.colorbar(p)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mecanical problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The linearized thermoelastic constitutive equation is given by:\n", + "\n", + "$$\\begin{equation}\n", + "\\boldsymbol{\\sigma} = \\mathbb{C}:(\\boldsymbol{\\varepsilon}-\\alpha(T-T_0)\\boldsymbol{1}) = \\lambda\\text{tr}(\\boldsymbol{\\varepsilon})\\boldsymbol{1}+2\\mu\\boldsymbol{\\varepsilon} -\\alpha(3\\lambda+2\\mu)(T-T_0)\\boldsymbol{1} \n", + "\\end{equation}$$\n", + "\n", + "where $\\lambda,\\mu$ are the Lamé parameters and $\\alpha$ is the thermal expansion coefficient. As regards the current problem, the last term corresponding to the thermal strains is completely known. The following formulation can thus be generalized to any kind of known initial stress or eigenstrain state such as pre-stress or phase changes." + ] + }, + { + "cell_type": "code", + "execution_count": 348, + "metadata": {}, + "outputs": [], + "source": [ + "E = Constant(50e3)\n", + "nu = Constant(0.2)\n", + "mu = E/2/(1+nu)\n", + "lmbda = E*nu/(1+nu)/(1-2*nu)\n", + "alpha = Constant(1e-5)\n", + "\n", + "f = Constant((0, 0))\n", + "\n", + "def eps(v):\n", + " return sym(grad(v))\n", + "def sigma(v, dT):\n", + " return (lmbda*tr(eps(v))- alpha*(3*lmbda+2*mu)*dT)*Identity(2) + 2.0*mu*eps(v)\n", + "\n", + "Vu = VectorFunctionSpace(mesh, 'CG', 2)\n", + "du = TrialFunction(Vu)\n", + "u_ = TestFunction(Vu)\n", + "Wint = inner(sigma(du, Delta_T), eps(u_))*dx\n", + "aM = lhs(Wint)\n", + "LM = rhs(Wint) + inner(f, u_)*dx\n", + "\n", + "bcu = DirichletBC(Vu, Constant((0., 0.)), lateral_sides)\n", + "\n", + "u = Function(Vu, name=\"Displacement\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, the self-weight loading is deactivated, only thermal stresses are computed." + ] + }, + { + "cell_type": "code", + "execution_count": 349, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "solve(aM == LM, u, bcu)\n", + "plt.figure(figsize=(18, 8))\n", + "p = plot(1e3*u[1],title=\"Vertical displacement [mm]\")\n", + "plt.colorbar(p)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 350, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 8))\n", + "p = plot(sigma(u, Delta_T)[0, 0],title=\"Horizontal stress [MPa]\")\n", + "plt.colorbar(p)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Raw Cell Format", + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/jupyter_notebooks/day-5/tutorials/2_multi_material.ipynb b/jupyter_notebooks/day-5/tutorials/2_multi_material.ipynb new file mode 100644 index 0000000..20c98e8 --- /dev/null +++ b/jupyter_notebooks/day-5/tutorials/2_multi_material.ipynb @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "https://hplgit.github.io/fenics-tutorial/pub/sphinx1/._ftut1005.html" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "metadata": {}, + "outputs": [], + "source": [ + "from dolfin import *\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 293, + "metadata": {}, + "outputs": [], + "source": [ + "length, depth = 1300, 300\n", + "num_ele_along_depth = 10\n", + "ele_size = depth/num_ele_along_depth\n", + "mesh = RectangleMesh(Point(0, 0), Point(length, depth),\n", + " int(length/ele_size), int(depth/ele_size))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## How to assign material properties to different subdomains?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Assigning material properties to different domains is a common task in finite element simulations using FEniCS. FEniCS provides a flexible way to handle complex geometries and define material properties on different regions of the mesh. To achieve this, we can use a `MeshFunction` to label different subdomains and then use `Measures` to integrate over these labeled subdomains.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 294, + "metadata": {}, + "outputs": [], + "source": [ + "mat_1_sub_domain = CompiledSubDomain(\"x[1]<=D/2\", D=depth)\n", + "mat_2_sub_domain = CompiledSubDomain(\"x[1]>=D/2\", D=depth)" + ] + }, + { + "cell_type": "code", + "execution_count": 295, + "metadata": {}, + "outputs": [], + "source": [ + "dim = mesh.topology().dim()\n", + "mf = MeshFunction(\"size_t\", mesh, dim)" + ] + }, + { + "cell_type": "code", + "execution_count": 296, + "metadata": {}, + "outputs": [], + "source": [ + "mat_1 = 1\n", + "mat_2 = 2" + ] + }, + { + "cell_type": "code", + "execution_count": 297, + "metadata": {}, + "outputs": [], + "source": [ + "mat_1_sub_domain.mark(mf, mat_1)\n", + "mat_2_sub_domain.mark(mf, mat_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 298, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 298, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(mf)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Material Properties\n", + "\n", + "Now, define the material properties for each domain. For this example, we'll consider two materials (material 1 and material 2):\n" + ] + }, + { + "cell_type": "code", + "execution_count": 335, + "metadata": {}, + "outputs": [], + "source": [ + "mat_prop = {\n", + " 1: {\"E\": 1.0, \"nu\": 0.30, \"rho\": 5e-8},\n", + " 2: {\"E\": 2.0, \"nu\": 0.25, \"rho\": 10e-8}\n", + "}\n", + "g = 9.81" + ] + }, + { + "cell_type": "code", + "execution_count": 336, + "metadata": {}, + "outputs": [], + "source": [ + "def epsilon(u):\n", + " return 0.5*(grad(u) + grad(u).T)\n", + "\n", + "\n", + "def sigma(u, mat_prop):\n", + " E, nu = mat_prop['E'], mat_prop['nu']\n", + " lmbda = (E * nu) / ((1 + nu) * (1 - 2 * nu))\n", + " mu = E / (2 * (1 + nu))\n", + " return lmbda*tr(epsilon(u))*Identity(dim) + 2*mu*epsilon(u)" + ] + }, + { + "cell_type": "code", + "execution_count": 337, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variational problem\n", + "U = VectorFunctionSpace(mesh,\"CG\",1)\n", + "u, v = TrialFunction(U), TestFunction(U)" + ] + }, + { + "cell_type": "code", + "execution_count": 338, + "metadata": {}, + "outputs": [], + "source": [ + "dx = Measure(\"dx\",subdomain_data = mf)" + ] + }, + { + "cell_type": "code", + "execution_count": 339, + "metadata": {}, + "outputs": [], + "source": [ + "a = inner(sigma(u, mat_prop[mat_1]), epsilon(v))*dx(mat_1) + \\\n", + " inner(sigma(u, mat_prop[mat_2]), epsilon(v))*dx(mat_2)\n", + "L = dot(Constant((0, -mat_prop[mat_1]['rho']*g)), v)*dx(mat_1) + \\\n", + " dot(Constant((0, -mat_prop[mat_2]['rho']*g)), v)*dx(mat_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 340, + "metadata": {}, + "outputs": [], + "source": [ + "clamped_boundary = CompiledSubDomain(\"near(x[0],0)\")\n", + "bc = DirichletBC(U, Constant((0,)*dim), clamped_boundary)" + ] + }, + { + "cell_type": "code", + "execution_count": 341, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute solution\n", + "u_sol = Function(U)\n", + "solve(a == L, u_sol, bc)" + ] + }, + { + "cell_type": "code", + "execution_count": 345, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calling FFC just-in-time (JIT) compiler, this may take some time.\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 345, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(18, 16))\n", + "# Plot solution\n", + "scale_factor = 3\n", + "plot(u_sol*scale_factor, title='Displacement', mode='displacement')" + ] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/jupyter_notebooks/day-5/tutorials/3_transient_analysis.ipynb b/jupyter_notebooks/day-5/tutorials/3_transient_analysis.ipynb new file mode 100644 index 0000000..5a4fa47 --- /dev/null +++ b/jupyter_notebooks/day-5/tutorials/3_transient_analysis.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Heat equation\n", + "\n", + "The heat equation is a fundamental partial differential equation that describes the evolution of temperature distribution over time in a given domain. In this tutorial, we will perform a 1D transient analysis of the heat equation.\n", + "\n", + "The 1D heat equation is given by:\n", + "\n", + "$$\n", + "\\frac{\\partial u}{\\partial t} = k \\frac{\\partial^2 u}{\\partial x^2} + f(x, t),\n", + "$$\n", + "\n", + "where $u(x, t)$ is the temperature distribution at position $x$ and time $t$, $k$ is the thermal conductivity, and $f(x, t)$ represents any source term in the equation. For this analysis, we consider a 1D domain $[0, L]$.\n", + "\n", + "https://hplgit.github.io/fenics-tutorial/pub/html/._ftut1006.html\n" + ] + }, + { + "cell_type": "code", + "execution_count": 351, + "metadata": {}, + "outputs": [], + "source": [ + "from fenics import *\n", + "\n", + "# Create a mesh\n", + "L = 1.0 # Length of the domain\n", + "nx = 100 # Number of spatial nodes\n", + "mesh = IntervalMesh(nx, 0, L)\n", + "\n", + "# Define the function space\n", + "degree = 1 # Linear elements\n", + "S = FunctionSpace(mesh, 'CG', degree)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initial Condition and Boundary Conditions\n", + "\n", + "We specify an initial temperature distribution $u_{\\text{initial}}(x)$ at $t = 0$. For this analysis, we use the expression $u_{\\text{initial}}(x) = \\exp(-100(x - 0.5)^2)$. Additionally, we need to impose boundary conditions to complete the problem formulation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 352, + "metadata": {}, + "outputs": [], + "source": [ + "# Define initial condition and boundary conditions\n", + "u_initial = Expression('20*sin(pi*x[0])', degree=2, domain=mesh)\n", + "u_n = interpolate(u_initial, S)\n", + "u_n_minus_1 = Function(S)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Temporal Discretization\n", + "\n", + "We define the total simulation time $T$ and the number of time steps $num\\_steps$. The time step size $dt$ is calculated as $dt = \\frac{T}{num\\_steps}$.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 353, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Define time discretization parameters\n", + "T = 1.0 # Total simulation time\n", + "num_steps = 5 # Number of time steps\n", + "dt = T / num_steps # Time step size\n", + "\n", + "# Define the heat equation\n", + "u = TrialFunction(S)\n", + "v = TestFunction(S)\n", + "k = Constant(1.0e-1) # Thermal conductivity\n", + "f = Constant(0.0) # Source term (zero for this example)" + ] + }, + { + "cell_type": "code", + "execution_count": 354, + "metadata": {}, + "outputs": [], + "source": [ + "support = CompiledSubDomain(\"on_boundary\")\n", + "# bc = DirichletBC(S, Constant(0), support)\n", + "bc = []" + ] + }, + { + "cell_type": "code", + "execution_count": 355, + "metadata": {}, + "outputs": [], + "source": [ + "a = u*v*dx + dt*k*inner(grad(u), grad(v))*dx\n", + "L = (u_n*v*dx + dt*f*v*dx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time-stepping Loop\n", + "\n", + "We use a time-stepping loop to iteratively solve the heat equation at each time step. At every time step, we update the temperature distribution based on the discretized equation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 356, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "u = Function(S)\n", + "t = 0\n", + "# Create a figure with the specified size\n", + "fig, ax = plt.subplots(figsize=(13, 8))\n", + "label = 'time: {0:3.1f}'.format(t) # Label for each curve\n", + "ax.plot(mesh.coordinates(), u_n.vector()[:], label=label, linewidth=3)\n", + "\n", + "for n in range(num_steps):\n", + " t += dt\n", + " solve(a == L, u, bc)\n", + "\n", + " # Update solution for the next time step\n", + " u_n_minus_1.assign(u_n)\n", + " u_n.assign(u)\n", + "\n", + " label = 'time: {0:3.1f}'.format(t) # Label for each curve\n", + " ax.plot(mesh.coordinates(), u.vector()[:], label=label, linewidth=3)\n", + "\n", + "# Add labels and legend\n", + "ax.set_xlabel('x')\n", + "ax.set_ylabel('Temperature')\n", + "ax.legend()\n", + "\n", + "# Show the plot\n", + "ax.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/mkdocs/.DS_Store b/mkdocs/.DS_Store index c79f2c8637ef9ff6850020de2c083cab335e6f42..b1bc858e925d93fb375ed4bdb59c7154b9b72c92 100644 GIT binary patch delta 113 zcmZoSXfc=|#>AjHu~68Ik%57Mg&~C@pCOr{IHfo_Cn-Na2P6mtOc06z#06pj2DtoY sMkaQ)%>qpG88>rq@N)po0*ZWRo-81u$O%%N0Ma?xlt+1UtjG#x0I53^%>V!Z delta 331 zcmZoMXg8Q3#>B`mF;R?_gMono$Pkfb0y01VL^Col2rwj-7Z)VuPBuLnu6 zFr+Z#GbA$Bn1{L;LXVzA!e%q*}B2PX$- zynsY?wTXqXj)Iwat&T#qp^2HHj)J+lMQtr7hp4i?bx?eEPHtX)7tp~#zzFmW81QmI z88E6F$bkE(EVw8yCqFM8D7G;{gl)2c2+L+}phtk=v@!8J^JIPzMOIJ{C`>jK5#H<} KvWJ<8mkR&|Zconu From 5aa9e33f27c9cc899cacc4e1112795c8aceff0d2 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta <32356220+iitrabhi@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:21:08 -0600 Subject: [PATCH 3/3] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 38f5d69..8c9da0e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ This is a five-day course focused on solving partial differential equations (PDEs) using the FEniCS software package. The goal is to introduce the students to PDEs encountered in various engineering and science disciplines, such as solid mechanics, heat transfer, and mass transport. +Website: [https://abhigupta.io/fenics-workshop](https://abhigupta.io/fenics-workshop) + The course materials, including tutorials and exercises, were created as part of a five-day workshop at IIT Madras, in collaboration with Vanderbilt University, USA. These materials are presented in [Jupyter Notebooks](https://jupyter.org/), which allow you to see both the code and its explanations, as well as the results, all together. The `tutorials` are comprehensive notebooks that demonstrate how to approach different types of problems using FEniCS. On the other hand, the `exercises` are meant to be interactive, and they encourage you to expand the notebooks by adding new functionalities. This way, you can develop your expertise in using FEniCS.