{
"cells": [
{
"cell_type": "markdown",
"id": "4ed9083f",
"metadata": {},
"source": [
"# General Concepts (with a time dependent problem)\n",
"In the following we introduce how to construct and use the basic components of\n",
"a finite element method ending with solving a heat equation.\n",
"The required steps are:\n",
"\n",
"* constructing a tessellation of the computational domain (**hierarchical grid** and **grid view**)\n",
"* working with functions defined over the grid (**grid functions**)\n",
"* setting up **discrete spaces** and **discrete functions**\n",
"* defining the mathematical model to solve (**ufl**)\n",
"* solving the (non linear) system arising from the discretization of the\n",
" model by the Galerkin method (**scheme**)"
]
},
{
"cell_type": "markdown",
"id": "063ffd5b",
"metadata": {
"lines_to_next_cell": 0
},
"source": [
".. index::\n",
" triple: Grids; Hierarchical Grids; Grid Definition\n",
"\n",
"## Setting up the Grid\n",
"\n",
".. note:: The goal of a Dune **grid** or **hierarchical grid** is to provide an\n",
" interface to describe subdivisions (entities or elements for codim 0) of the computational domain $\\Omega$\n",
" in a generic way. In the following this is referred to as `hierarchicalGrid`.\n",
" See , Section 3.1, for more details.\n",
"\n",
".. note:: Grids can be refined in a hierarchic manner, meaning that elements are subdivided into several smaller elements. The\n",
" element to be refined is kept in the grid and remains accessible. One\n",
" can either refine all elements (global refinement) as described below.\n",
" We will discuss [local refinement](gridviews.rst#Dynamic-Local-Grid-Refinement-and-Coarsening)\n",
" in a later section.\n",
"\n",
"After some general import statements we start our tutorial by setting up\n",
"a simple Cartesian grid over the domain $\\Omega = [0,1]^2$ subdivided into four\n",
"intervals in each dimension. We can then show the grid using the `plot`\n",
"method - note that direct plotting with MatPlotLib is only supported in\n",
"2D, other options for visualization, e.g., using ParaView will be\n",
"discussed later.\n",
"\n",
"Using the `dune.grid.structuredGrid` function is the simplest way to construct\n",
"a grid, more complicated\n",
"(unstructured) grids can be constructed using a dictionary containing the\n",
"vertices and the element connectivity or by for example providing a\n",
"`gmsh` file. This will be discussed in later section, see for example\n",
"here for [a 3d gmsh file](othergrids_nb.ipynb)\n",
"or here [for a simple example using a dictionary](dune-corepy_nb.ipynb#Unstructured-grids).\n",
"\n",
".. index::\n",
" pair: Grids; Plotting\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9a23cbe7",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:22:32.051824Z",
"iopub.status.busy": "2024-02-29T12:22:32.051616Z",
"iopub.status.idle": "2024-02-29T12:26:06.147800Z",
"shell.execute_reply": "2024-02-29T12:26:06.146410Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"import numpy as np\n",
"\n",
"from dune.grid import structuredGrid as leafGridView\n",
"gridView = leafGridView([0, 0], [1, 1], [4, 4])\n",
"gridView.plot()"
]
},
{
"cell_type": "markdown",
"id": "026106d5",
"metadata": {},
"source": [
"Often the initial grid is a bit coarse - it is very easy to refine it\n",
"globally.\n",
"\n",
".. index::\n",
" pair: Grid view; Grid view Definition\n",
"\n",
".. note:: A **grid view** object provides read-only access to the entities of all codimensions\n",
"of a subset of the `hierarchical grid`.\n",
"In the following this is called `gridView` and sometimes simply `grid`.\n",
"See , Section 3.1.1, for more details.\n",
"\n",
".. tip:: The functions constructing a grid generally return a **leaf grid view**,\n",
"i.e., only contains of a view of the finest grid elements.\n",
"We also provide some special grid views to for example simulate on\n",
"[evolving domains](gridviews.rst#Evolving-Domains) or\n",
"to simplify efficient [local grid adaptivity](gridviews.rst#Dynamic-Local-Grid-Refinement-and-Coarsening).\n",
"\n",
"Since a `gridView` can not be changed\n",
"directly we need to access the underlying `hierarchicalGrid` to perform\n",
"e.g. grid refinement. So to globally refine the grid call"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ef121ba2",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:06.153002Z",
"iopub.status.busy": "2024-02-29T12:26:06.152188Z",
"iopub.status.idle": "2024-02-29T12:26:06.371273Z",
"shell.execute_reply": "2024-02-29T12:26:06.370506Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gridView.hierarchicalGrid.globalRefine(1)\n",
"gridView.plot()"
]
},
{
"cell_type": "markdown",
"id": "b7214460",
"metadata": {},
"source": [
"If `level>0` then the\n",
"grid is refined down by the given level and `level<0` leads to global\n",
"coarsening of the grid by the given number of levels (if possible).\n",
"\n",
".. tip:: the effect of this refinement will depend on the underlying\n",
"grid manager. For Cartesian grid for example refining by one level leads\n",
"a reduction of the grid spacing by 2 while for a bisection grid in $d$\n",
"space dimensions one needs to refine by $2^{d-1}$ levels to achieve the same effect.\n",
"\n",
"In addition to the `globalRefine` method on the `hierarchicalGrid`\n",
"`dune-fem` also provides a `globalRefine` function, which takes the\n",
"`level` as the first argument and a hierarchical grid as second argument.\n",
"This method can also be used to prolong and restrict discrete functions\n",
"as will be discussed in [a later section](gridviews.rst#Dynamic-Local-Grid-Refinement-and-Coarsening)."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "e06f4a08",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:06.374660Z",
"iopub.status.busy": "2024-02-29T12:26:06.374392Z",
"iopub.status.idle": "2024-02-29T12:26:06.709575Z",
"shell.execute_reply": "2024-02-29T12:26:06.708537Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from dune.fem import globalRefine\n",
"globalRefine(1,gridView.hierarchicalGrid) # the first argument is the number of refinements to perform\n",
"gridView.plot()\n",
"globalRefine(-1,gridView.hierarchicalGrid) # coarsen again by one level\n",
"gridView.plot()"
]
},
{
"cell_type": "markdown",
"id": "47d318ee",
"metadata": {},
"source": [
".. index::\n",
" pair: Functions; Grid Functions\n",
"\n",
"## Grid Functions\n",
"\n",
".. note:: A **grid function** is a function that is defined\n",
"over a given grid view and is evaluated by using an element\n",
"of this view and local coordinate within that element, e.g., a quadrature point.\n",
"\n",
"For example:\n",
"```\n",
" value = gridFunction(element,localCoordinate)\n",
"```\n",
"Alternatively one can obtain a `LocalFunction` from a grid function which\n",
"can be bound to an element and then evaluate via local coordinate:\n",
"```\n",
" localFunction = gridFunction.localFunction()\n",
" for e in grid.elements:\n",
" localFunction.bind(e)\n",
" value = localFunction(x)\n",
" localFunction.unbind()\n",
"```\n",
"There are multiple ways to construct grid functions. The easiest way it\n",
"to use UFL expression. Many methods expecting grid functions as argument\n",
"can also directly handle UFL expression.\n",
"We can for example integrate a UFL expression over the grid:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2fe62a32",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:06.712483Z",
"iopub.status.busy": "2024-02-29T12:26:06.712217Z",
"iopub.status.idle": "2024-02-29T12:26:06.785142Z",
"shell.execute_reply": "2024-02-29T12:26:06.784481Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.3333333333333324\n"
]
}
],
"source": [
"from ufl import SpatialCoordinate, triangle\n",
"x = SpatialCoordinate(triangle)\n",
"\n",
"exact = 1/2*(x[0]**2+x[1]**2) - 1/3*(x[0]**3 - x[1]**3) + 1\n",
"\n",
"from dune.fem import integrate\n",
"print( integrate(exact, gridView=gridView, order=5) )"
]
},
{
"cell_type": "markdown",
"id": "6e145db9",
"metadata": {},
"source": [
".. index::\n",
" pair: I/O; VTK files\n",
"\n",
"and plot them using matplotlib or write a vtk file for postprocessing"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "bad48639",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:06.787922Z",
"iopub.status.busy": "2024-02-29T12:26:06.787697Z",
"iopub.status.idle": "2024-02-29T12:26:07.046131Z",
"shell.execute_reply": "2024-02-29T12:26:07.045436Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from dune.fem.plotting import plotPointData as plot\n",
"plot(exact, gridView=gridView)\n",
"gridView.writeVTK('exact', pointdata={'exact': exact})"
]
},
{
"cell_type": "markdown",
"id": "6ab09aa3",
"metadata": {},
"source": [
"In some cases it can be necessary to convert a UFL expression into a grid\n",
"function explicitly - for example to be able to evaluate it over each\n",
"element in the grid ([in a later section](dune-corepy_nb.ipynb)\n",
"we provide more detail on how to access the grid interface).\n",
"\n",
".. index::\n",
" pari: dune.fem.function; gridFunction\n",
"\n",
".. note:: ``dune.fem.function.gridFunction`` provides different options for\n",
"constructing grid functions: it can be used as decorator of Python\n",
"function, provided with a C++ code snippet, or an ufl expression.\n",
"\n",
".. index::\n",
" triple: Functions; dune.fem.function; ufl grid function\n",
"\n",
"We will discuss the second usages later and have some example for using\n",
"C++ code snippets [in a later section](cppfunctions_nb.ipynb).\n",
"If the first argument `expr`\n",
"is a ufl expression then a grid function is generated\n",
"which can be efficiently evaluated on both the Python and the C++ side.\n",
"\n",
".. tip:: Especially in time critical parts of the code the usage of\n",
" ``gridFunction`` is strongly encouraged to speed up simulations.\n",
"\n",
"Like ``assemble`` and ``integrate``, `gridFunction` takes two additional\n",
"arguments ``order`` and ``gridView``. These are required arguments if a\n",
"code snippet is used or the ``gridView`` is used as a decorator. If the\n",
"basis of the grid function is a ufl expression these can be omitted in\n",
"many cases where they can be determined from the expression itself. See the\n",
"[introduction](dune-fempy_nb.ipynb) for more detail.\n",
"\n",
"In the next example the ``gridView`` argument is required:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "27da686f",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:07.048767Z",
"iopub.status.busy": "2024-02-29T12:26:07.048552Z",
"iopub.status.idle": "2024-02-29T12:26:07.079909Z",
"shell.execute_reply": "2024-02-29T12:26:07.079202Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.33203125\n"
]
}
],
"source": [
"from dune.fem.function import gridFunction\n",
"exact_gf = gridFunction(exact, gridView, name=\"ufl\")\n",
"mass = 0\n",
"for element in gridView.elements:\n",
" mass += exact_gf(element,[0.5,0.5]) * element.geometry.volume\n",
"print(mass)"
]
},
{
"cell_type": "markdown",
"id": "ecb12ab8",
"metadata": {},
"source": [
".. index::\n",
" triple: Functions; dune.fem.function; grid function decorator\n",
"\n",
"Another way to obtain a grid function is to use the `gridFunction` as\n",
"decorator. This can be obtained from `dune.grid` but then without UFL\n",
"support. Using the decorator from `dune.fem.function` the resulting grid\n",
"function can be used seamlessly within UFL expressions:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "b2bb797a",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:07.082709Z",
"iopub.status.busy": "2024-02-29T12:26:07.082495Z",
"iopub.status.idle": "2024-02-29T12:26:32.926966Z",
"shell.execute_reply": "2024-02-29T12:26:32.925504Z"
},
"lines_to_next_cell": 1
},
"outputs": [],
"source": [
"from dune.fem.function import gridFunction\n",
"@gridFunction(gridView,name=\"callback\",order=1)\n",
"def exactLocal(element,xLocal):\n",
" x = element.geometry.toGlobal(xLocal)\n",
" return 1/2.*(x[0]**2+x[1]**2) - 1/3*(x[0]**3 - x[1]**3) + 1"
]
},
{
"cell_type": "markdown",
"id": "1081f69c",
"metadata": {},
"source": [
"We can use the same approach but with a function using global\n",
"coordinates but can then be used like any other grid function:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "6a5c92f1",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:32.933146Z",
"iopub.status.busy": "2024-02-29T12:26:32.932363Z",
"iopub.status.idle": "2024-02-29T12:26:32.946471Z",
"shell.execute_reply": "2024-02-29T12:26:32.945069Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.33203125\n"
]
}
],
"source": [
"@gridFunction(gridView,name=\"callback\",order=1)\n",
"def exactGlobal(x):\n",
" return 1/2.*(x[0]**2+x[1]**2) - 1/3*(x[0]**3 - x[1]**3) + 1\n",
"\n",
"lf = exactGlobal.localFunction()\n",
"\n",
"mass = 0\n",
"for element in gridView.elements:\n",
" lf.bind(element)\n",
" mass += lf([0.5,0.5]) * element.geometry.volume\n",
" lf.unbind()\n",
"print(mass)"
]
},
{
"cell_type": "markdown",
"id": "7d8002ce",
"metadata": {},
"source": [
".. index::\n",
" pair: Functions; UFL functions\n",
"\n",
"As pointed out the `dune.fem` grid function can be used like any other\n",
"UFL coefficient to form UFL expressions:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0cc924ea",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:26:32.951166Z",
"iopub.status.busy": "2024-02-29T12:26:32.950002Z",
"iopub.status.idle": "2024-02-29T12:27:44.205839Z",
"shell.execute_reply": "2024-02-29T12:27:44.205115Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0\n"
]
},
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print( integrate(abs(exact-exactLocal)) )\n",
"gf = gridFunction(exact-exactLocal+exactGlobal, name=\"ufl\")\n",
"fig = plt.figure(figsize=(25,10))\n",
"gf.plot(figure=(fig,121))\n",
"exactGlobal.plot(figure=(fig,122))"
]
},
{
"cell_type": "markdown",
"id": "6c189078",
"metadata": {},
"source": [
"Converting UFL expressions to grid functions leads to JIT code generation\n",
"and is therefore efficient when used in other C++ algorithm (like\n",
"`integrate`). But more complex control structures are hard to express\n",
"within UFL. On the other hand using the `gridFunction` decorator leads\n",
"to a callback into Python for each evaluation and is therefore much less\n",
"efficient. An alternative approach is based on writing small C++ snippets\n",
"implementing the grid function as described in the section on\n",
"generating\n",
"[C++ Based Grid Functions](cppfunctions_nb.ipynb)."
]
},
{
"cell_type": "markdown",
"id": "7fc5b425",
"metadata": {},
"source": [
"\n",
".. index::\n",
" pair: Spaces; Lagrange Space\n",
"\n",
"## Discrete Spaces\n",
"\n",
"The grid functions set up so far did not involve any\n",
"discretization, they are exactly evaluated at the given point. We next\n",
"discuss functions over finite dimensional (discrete) spaces.\n",
"\n",
".. note:: A **discrete (function) space** is a finite dimensional function space\n",
"defined over a given grid view. Typically these are Finite Element\n",
"spaces.\n",
"\n",
"Let us start with a Lagrange finite element space consisting of piecewise\n",
"quadratic functions (``order=2``):"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "0eb2e605",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.212824Z",
"iopub.status.busy": "2024-02-29T12:27:44.212570Z",
"iopub.status.idle": "2024-02-29T12:27:44.661036Z",
"shell.execute_reply": "2024-02-29T12:27:44.659848Z"
}
},
"outputs": [],
"source": [
"from dune.fem.space import lagrange as solutionSpace\n",
"space = solutionSpace(gridView, order=2)"
]
},
{
"cell_type": "markdown",
"id": "3b760238",
"metadata": {},
"source": [
"\n",
"A list of available spaces is shown at the bottom of this page.\n",
"The main method on the space is ``interpolate`` that returns an\n",
"element of the space (a discrete function) applying the natural\n",
"interpolation into the space to a given (ufl) expression.\n",
"This is explained in detail in the next section.\n",
"\n",
".. tip::\n",
" In addition to the ``order`` argument most spaces take an additional\n",
" ``dimRange`` argument to construct vector valued spaces $V^n$. Note\n",
" that by default a scalar space is constructed which differs in usage\n",
" from the space with ``dimRange=1``. Discrete function over the latter\n",
" have to be treated as vector valued functions of dimension one, e.g.,\n",
" instead of ``uh*uh`` one needs ``uh[0]*uh[0]`` or ``ufl.dot(uh,uh)``.\n",
"\n",
"Two other methods on the discrete spaces worth noting provide access to the local to global dof\n",
"mapper and evaluate the basis functions.\n",
"\n",
"First we have the ``mapper`` method. This returns a callable object which\n",
"for a given element in the grid, returns the vector of global indices for\n",
"the basis functions with support on the element:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "e31da0ba",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.666097Z",
"iopub.status.busy": "2024-02-29T12:27:44.665794Z",
"iopub.status.idle": "2024-02-29T12:27:44.671584Z",
"shell.execute_reply": "2024-02-29T12:27:44.670605Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0, 81, 1, 153, 225, 154, 9, 89, 10]\n",
"[1, 82, 2, 154, 226, 155, 10, 90, 11]\n",
"[2, 83, 3, 155, 227, 156, 11, 91, 12]\n",
"[3, 84, 4, 156, 228, 157, 12, 92, 13]\n",
"[4, 85, 5, 157, 229, 158, 13, 93, 14]\n"
]
}
],
"source": [
"mapper = space.mapper\n",
"for i,element in enumerate(gridView.elements):\n",
" print( mapper(element) )\n",
" if i == 4: break # only show indices for first few elements"
]
},
{
"cell_type": "markdown",
"id": "cc93666a",
"metadata": {},
"source": [
"\n",
"To access the basis functions with support on an element we provide the\n",
"method ``evaluateBasis``, ``jacobianBasis``:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "bd9658b8",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.676714Z",
"iopub.status.busy": "2024-02-29T12:27:44.676515Z",
"iopub.status.idle": "2024-02-29T12:27:44.682820Z",
"shell.execute_reply": "2024-02-29T12:27:44.681903Z"
},
"lines_to_next_cell": 2
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Dune::FieldVector<1>(0.518400), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(0.129600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(0.006400)]\n",
"[Dune::FieldVector<1>(0.518400), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(0.129600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(0.006400)]\n",
"[Dune::FieldVector<1>(0.518400), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(0.129600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(0.006400)]\n",
"[Dune::FieldVector<1>(0.518400), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(0.129600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(0.006400)]\n",
"[Dune::FieldVector<1>(0.518400), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(0.259200), Dune::FieldVector<1>(0.129600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(-0.057600), Dune::FieldVector<1>(-0.028800), Dune::FieldVector<1>(0.006400)]\n",
"convert to a numpy array: [[[-14.976 -14.976]]\n",
"\n",
" [[ 18.432 -7.488]]\n",
"\n",
" [[ -3.456 1.664]]\n",
"\n",
" [[ -7.488 18.432]]\n",
"\n",
" [[ 9.216 9.216]]\n",
"\n",
" [[ -1.728 -2.048]]\n",
"\n",
" [[ 1.664 -3.456]]\n",
"\n",
" [[ -2.048 -1.728]]\n",
"\n",
" [[ 0.384 0.384]]]\n"
]
}
],
"source": [
"localPoint = [0.1,0.1] # this is in the reference element\n",
"for i,element in enumerate(gridView.elements):\n",
" print( space.evaluateBasis(element, localPoint) )\n",
" if i == 4: break\n",
"print(\"convert to a numpy array:\", np.array( space.jacobianBasis(element, localPoint) ) )"
]
},
{
"cell_type": "markdown",
"id": "5ce8e5a4",
"metadata": {},
"source": [
"\n",
".. index::\n",
" pair: Functions; Discrete Functions\n",
"\n",
"## Discrete Functions\n",
"\n",
".. note:: A special type of grid function is a **discrete function** living in a\n",
"discrete (finite dimensional) space. The main property of a discrete\n",
"function is that it contains a **dof vector**.\n",
"[In a later section](solvers_nb.ipynb)\n",
"we will see how to extract the underlying dof vector in the form of a `numpy` or a `petsc` vector.\n",
"\n",
"\n",
"The easiest way to construct a discrete function is to use the `interpolate`\n",
"method on the discrete function space to create an initialized discrete\n",
"function or `function` to create an uninitialized discrete function."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "fe06b8a7",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.687767Z",
"iopub.status.busy": "2024-02-29T12:27:44.687562Z",
"iopub.status.idle": "2024-02-29T12:27:44.714356Z",
"shell.execute_reply": "2024-02-29T12:27:44.713235Z"
}
},
"outputs": [],
"source": [
"# initialized\n",
"u_h = space.interpolate(exact, name='u_h')\n",
"\n",
"# uninitialized\n",
"u_h = space.function(name='u_h')"
]
},
{
"cell_type": "markdown",
"id": "7b651de7",
"metadata": {},
"source": [
"On an existing discrete function the `interpolate` method can be used to\n",
"reinitialize it"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "33856166",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.720103Z",
"iopub.status.busy": "2024-02-29T12:27:44.719870Z",
"iopub.status.idle": "2024-02-29T12:27:44.927930Z",
"shell.execute_reply": "2024-02-29T12:27:44.926721Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"u_h.interpolate( lambda x: 1/2.*(x[0]**2+x[1]**2) - 1/3*(x[0]**3 - x[1]**3) + 1 )\n",
"u_h.plot()"
]
},
{
"cell_type": "markdown",
"id": "35f6ce5b",
"metadata": {},
"source": [
"Note that in the last example the Python lambda is used as a callback\n",
"automatically using the same concept used in the `gridFunction`\n",
"decorator. As pointed out above there are some methods where these\n",
"conversions are implicit and no explicit generation of a grid function\n",
"has to be carried out.\n",
"\n",
"If a discrete function is already available it is possible to call `copy`\n",
"to obtain further discrete functions:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "24c4f296",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.934461Z",
"iopub.status.busy": "2024-02-29T12:27:44.934070Z",
"iopub.status.idle": "2024-02-29T12:27:44.939380Z",
"shell.execute_reply": "2024-02-29T12:27:44.938417Z"
}
},
"outputs": [],
"source": [
"u_h_n = u_h.copy(name=\"previous\")"
]
},
{
"cell_type": "markdown",
"id": "1da9b8d0",
"metadata": {},
"source": [
"Finally, `clear` can be called on a discrete function which sets all\n",
"coefficient to zero and `assign` can be used to copy all coefficients\n",
"between two discrete function over the same space:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "8b9032eb",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.943918Z",
"iopub.status.busy": "2024-02-29T12:27:44.943714Z",
"iopub.status.idle": "2024-02-29T12:27:44.948053Z",
"shell.execute_reply": "2024-02-29T12:27:44.947000Z"
}
},
"outputs": [],
"source": [
"u_h_n.clear()\n",
"u_h_n.assign( u_h )"
]
},
{
"cell_type": "markdown",
"id": "3f32e53d",
"metadata": {},
"source": [
"All the things we did above with grid functions can be done with discrete\n",
"functions, e.g., evaluate locally"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "0b813f96",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.952635Z",
"iopub.status.busy": "2024-02-29T12:27:44.952441Z",
"iopub.status.idle": "2024-02-29T12:27:44.958600Z",
"shell.execute_reply": "2024-02-29T12:27:44.957514Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.33203125\n"
]
}
],
"source": [
"localUh = u_h.localFunction()\n",
"mass = 0\n",
"for element in gridView.elements:\n",
" localUh.bind(element) # using u_h(element,[0.5,0.5]) also works\n",
" mass += localUh([0.5,0.5]) * element.geometry.volume\n",
" localUh.unbind()\n",
"print(mass)"
]
},
{
"cell_type": "markdown",
"id": "841a92e0",
"metadata": {},
"source": [
".. index::\n",
" pair: Functions; Plotting\n",
"\n",
".. index::\n",
" pair: I/O; VTK files\n",
"\n",
"or plot using matplotlib and write a vtk file for postprocessing\n",
"(using binary data format to reduce size)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "fc3ee9b0",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:44.963339Z",
"iopub.status.busy": "2024-02-29T12:27:44.963118Z",
"iopub.status.idle": "2024-02-29T12:27:45.164970Z",
"shell.execute_reply": "2024-02-29T12:27:45.163831Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"u_h.plot(gridLines=\"white\", linewidth=2)\n",
"from dune.grid import OutputType\n",
"gridView.writeVTK('uh', pointdata=[u_h])"
]
},
{
"cell_type": "markdown",
"id": "bdf670e3",
"metadata": {},
"source": [
"\n",
".. tip:: The discrete function `u_h` already has a `name` attribute given in\n",
"the `interpolate` call. This is used by default in the vtk file. An\n",
"alternative name can be given by using a dictionary as shown previously.\n",
"\n",
"Of course a discrete function can also be used as a coefficient in a UFL expression"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "2a87c9fd",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:27:45.169869Z",
"iopub.status.busy": "2024-02-29T12:27:45.169651Z",
"iopub.status.idle": "2024-02-29T12:28:21.139401Z",
"shell.execute_reply": "2024-02-29T12:28:21.137984Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.1323256792013636e-05\n"
]
}
],
"source": [
"print( integrate(abs(exact-u_h)) )"
]
},
{
"cell_type": "markdown",
"id": "8ce147ce",
"metadata": {
"lines_to_next_cell": 0
},
"source": [
"The main difference between a grid function and a discrete function is\n",
"that the latter has a `dofVector` attached to it. We can iterate over\n",
"that easily"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "5220b796",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:28:21.144895Z",
"iopub.status.busy": "2024-02-29T12:28:21.144551Z",
"iopub.status.idle": "2024-02-29T12:28:21.154425Z",
"shell.execute_reply": "2024-02-29T12:28:21.153317Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0, 1.0071614583333333, 1.0260416666666667, 1.052734375, 1.0833333333333333, 1.1139322916666667, 1.140625, 1.1595052083333333, 1.1666666666666667, 1.0084635416666667, 1.015625, 1.0345052083333333, 1.0611979166666667, 1.091796875, 1.1223958333333333, 1.1490885416666667, 1.16796875, 1.1751302083333335, 1.0364583333333333, 1.0436197916666667, 1.0625, 1.0891927083333333, 1.1197916666666667, 1.150390625, 1.1770833333333333, 1.1959635416666667, 1.203125, 1.087890625, 1.0950520833333333, 1.1139322916666667, 1.140625, 1.1712239583333333, 1.2018229166666667, 1.228515625, 1.2473958333333333, 1.2545572916666667, 1.1666666666666667, 1.173828125, 1.1927083333333333, 1.2194010416666667, 1.25, 1.2805989583333333, 1.3072916666666667, 1.326171875, 1.3333333333333335, 1.2766927083333333, 1.2838541666666665, 1.302734375, 1.3294270833333333, 1.3600260416666667, 1.390625, 1.4173177083333333, 1.4361979166666667, 1.443359375, 1.421875, 1.4290364583333333, 1.4479166666666665, 1.474609375, 1.5052083333333335, 1.5358072916666665, 1.5625, 1.5813802083333335, 1.5885416666666667, 1.6061197916666665, 1.61328125, 1.6321614583333333, 1.6588541666666665, 1.689453125, 1.7200520833333333, 1.7467447916666665, 1.765625, 1.7727864583333335, 1.8333333333333333, 1.8404947916666665, 1.859375, 1.8860677083333333, 1.9166666666666665, 1.947265625, 1.9739583333333333, 1.9928385416666665, 2.0, 1.0018717447916667, 1.015380859375, 1.0386555989583333, 1.0677897135416667, 1.098876953125, 1.1280110677083333, 1.1512858072916667, 1.164794921875, 1.0103352864583333, 1.0238444010416667, 1.047119140625, 1.0762532552083333, 1.1073404947916667, 1.136474609375, 1.1597493489583333, 1.1732584635416667, 1.038330078125, 1.0518391927083333, 1.0751139322916667, 1.104248046875, 1.1353352864583333, 1.1644694010416667, 1.187744140625, 1.2012532552083335, 1.0897623697916667, 1.103271484375, 1.1265462239583333, 1.1556803385416667, 1.186767578125, 1.2159016927083333, 1.2391764322916667, 1.252685546875, 1.1685384114583333, 1.1820475260416667, 1.205322265625, 1.2344563802083333, 1.2655436197916667, 1.294677734375, 1.3179524739583335, 1.3314615885416667, 1.278564453125, 1.2920735677083333, 1.3153483072916665, 1.344482421875, 1.3755696614583333, 1.4047037760416667, 1.427978515625, 1.4414876302083335, 1.4237467447916665, 1.437255859375, 1.4605305989583333, 1.4896647135416665, 1.520751953125, 1.5498860677083335, 1.5731608072916665, 1.586669921875, 1.6079915364583333, 1.6215006510416665, 1.644775390625, 1.6739095052083333, 1.7049967447916665, 1.734130859375, 1.7574055989583335, 1.7709147135416665, 1.835205078125, 1.8487141927083333, 1.8719889322916665, 1.901123046875, 1.9322102864583333, 1.9613444010416665, 1.984619140625, 1.9981282552083335, 1.0020345052083333, 1.0091959635416667, 1.028076171875, 1.0547688802083333, 1.0853678385416667, 1.115966796875, 1.1426595052083333, 1.1615397135416667, 1.168701171875, 1.019775390625, 1.0269368489583333, 1.0458170572916667, 1.072509765625, 1.1031087239583333, 1.1337076822916667, 1.160400390625, 1.1792805989583333, 1.1864420572916667, 1.0590006510416667, 1.066162109375, 1.0850423177083333, 1.1117350260416667, 1.142333984375, 1.1729329427083333, 1.1996256510416667, 1.218505859375, 1.2256673177083335, 1.1236165364583333, 1.1307779947916667, 1.149658203125, 1.1763509114583333, 1.2069498697916667, 1.237548828125, 1.2642415364583335, 1.2831217447916667, 1.290283203125, 1.217529296875, 1.2246907552083333, 1.2435709635416667, 1.270263671875, 1.3008626302083333, 1.3314615885416667, 1.358154296875, 1.3770345052083335, 1.3841959635416667, 1.3446451822916665, 1.351806640625, 1.3706868489583333, 1.3973795572916665, 1.427978515625, 1.4585774739583333, 1.4852701822916667, 1.504150390625, 1.5113118489583335, 1.5088704427083333, 1.5160319010416665, 1.534912109375, 1.5616048177083333, 1.5922037760416665, 1.622802734375, 1.6494954427083335, 1.6683756510416665, 1.675537109375, 1.714111328125, 1.7212727864583333, 1.7401529947916665, 1.766845703125, 1.7974446614583333, 1.8280436197916665, 1.854736328125, 1.8736165364583335, 1.8807779947916665, 1.00390625, 1.0174153645833333, 1.0406901041666667, 1.06982421875, 1.1009114583333333, 1.1300455729166667, 1.1533203125, 1.1668294270833335, 1.0216471354166667, 1.03515625, 1.0584309895833333, 1.0875651041666667, 1.11865234375, 1.1477864583333333, 1.1710611979166667, 1.1845703125, 1.0608723958333333, 1.0743815104166667, 1.09765625, 1.1267903645833333, 1.1578776041666667, 1.18701171875, 1.2102864583333333, 1.2237955729166667, 1.12548828125, 1.1389973958333333, 1.1622721354166667, 1.19140625, 1.2224934895833333, 1.2516276041666667, 1.27490234375, 1.2884114583333335, 1.2194010416666667, 1.23291015625, 1.2561848958333333, 1.2853190104166667, 1.31640625, 1.3455403645833333, 1.3688151041666667, 1.38232421875, 1.3465169270833333, 1.3600260416666665, 1.38330078125, 1.4124348958333333, 1.4435221354166667, 1.47265625, 1.4959309895833335, 1.5094401041666667, 1.5107421875, 1.5242513020833333, 1.5475260416666665, 1.57666015625, 1.6077473958333335, 1.6368815104166665, 1.66015625, 1.6736653645833335, 1.7159830729166665, 1.7294921875, 1.7527669270833333, 1.7819010416666665, 1.81298828125, 1.8421223958333333, 1.8653971354166665, 1.87890625, \n"
]
}
],
"source": [
"for d in u_h.dofVector:\n",
" print(d,end=\", \")\n",
"print()"
]
},
{
"cell_type": "markdown",
"id": "633ad508",
"metadata": {
"lines_to_next_cell": 0
},
"source": [
"In addition to `clear` and `assign` we can also add (scalar\n",
"multiples of) discrete functions together or multiply them by a scalar\n",
"which will directly change the underlying dofVector - this can only be\n",
"done __in place__, so `u_h *= 2` changes the dof vector while\n",
"`u_h*2` results in an UFL expression. Here are some examples:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "ed6ea445",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:28:21.159661Z",
"iopub.status.busy": "2024-02-29T12:28:21.159285Z",
"iopub.status.idle": "2024-02-29T12:28:21.164455Z",
"shell.execute_reply": "2024-02-29T12:28:21.163344Z"
}
},
"outputs": [],
"source": [
"u_h_n *= 2\n",
"u_h += u_h_n\n",
"# this is equivalent to\n",
"u_h.axpy(2,u_h_n)"
]
},
{
"cell_type": "markdown",
"id": "090f4e83",
"metadata": {},
"source": [
"We started with `u_h_n=u_h` so after these changes each dof in\n",
"`u_h` should be seven times its original value"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "0a878a78",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:28:21.169417Z",
"iopub.status.busy": "2024-02-29T12:28:21.169148Z",
"iopub.status.idle": "2024-02-29T12:28:21.177524Z",
"shell.execute_reply": "2024-02-29T12:28:21.176485Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.0, 7.050130208333333, 7.182291666666667, 7.369140625, 7.583333333333333, 7.797526041666667, 7.984375, 8.116536458333332, 8.166666666666668, 7.059244791666667, 7.109375, 7.241536458333333, 7.428385416666667, 7.642578125, 7.856770833333333, 8.043619791666668, 8.17578125, 8.225911458333334, 7.255208333333333, 7.305338541666667, 7.4375, 7.624348958333333, 7.838541666666667, 8.052734375, 8.239583333333332, 8.371744791666668, 8.421875, 7.615234375, 7.665364583333333, 7.797526041666667, 7.984375, 8.198567708333332, 8.412760416666668, 8.599609375, 8.731770833333332, 8.781901041666668, 8.166666666666668, 8.216796875, 8.348958333333332, 8.535807291666668, 8.75, 8.964192708333332, 9.151041666666668, 9.283203125, 9.333333333333334, 8.936848958333332, 8.986979166666666, 9.119140625, 9.305989583333332, 9.520182291666668, 9.734375, 9.921223958333332, 10.053385416666668, 10.103515625, 9.953125, 10.003255208333332, 10.135416666666666, 10.322265625, 10.536458333333334, 10.750651041666666, 10.9375, 11.069661458333334, 11.119791666666668, 11.242838541666666, 11.29296875, 11.425130208333332, 11.611979166666666, 11.826171875, 12.040364583333332, 12.227213541666666, 12.359375, 12.409505208333334, 12.833333333333332, 12.883463541666666, 13.015625, 13.202473958333332, 13.416666666666666, 13.630859375, 13.817708333333332, 13.949869791666666, 14.0, 7.013102213541667, 7.107666015625, 7.270589192708333, 7.474527994791667, 7.692138671875, 7.896077473958333, 8.059000651041668, 8.153564453125, 7.072347005208333, 7.166910807291667, 7.329833984375, 7.533772786458333, 7.751383463541667, 7.955322265625, 8.118245442708332, 8.212809244791668, 7.268310546875, 7.362874348958333, 7.525797526041667, 7.729736328125, 7.947347005208333, 8.151285807291668, 8.314208984375, 8.408772786458334, 7.628336588541667, 7.722900390625, 7.885823567708333, 8.089762369791668, 8.307373046875, 8.511311848958332, 8.674235026041668, 8.768798828125, 8.179768880208332, 8.274332682291668, 8.437255859375, 8.641194661458332, 8.858805338541668, 9.062744140625, 9.225667317708334, 9.320231119791668, 8.949951171875, 9.044514973958332, 9.207438151041666, 9.411376953125, 9.628987630208332, 9.832926432291668, 9.995849609375, 10.090413411458334, 9.966227213541666, 10.060791015625, 10.223714192708332, 10.427652994791666, 10.645263671875, 10.849202473958334, 11.012125651041666, 11.106689453125, 11.255940755208332, 11.350504557291666, 11.513427734375, 11.717366536458332, 11.934977213541666, 12.138916015625, 12.301839192708334, 12.396402994791666, 12.846435546875, 12.940999348958332, 13.103922526041666, 13.307861328125, 13.525472005208332, 13.729410807291666, 13.892333984375, 13.986897786458334, 7.014241536458333, 7.064371744791667, 7.196533203125, 7.383382161458333, 7.597574869791667, 7.811767578125, 7.998616536458333, 8.130777994791668, 8.180908203125, 7.138427734375, 7.188557942708333, 7.320719401041667, 7.507568359375, 7.721761067708333, 7.935953776041667, 8.122802734375, 8.254964192708332, 8.305094401041668, 7.413004557291667, 7.463134765625, 7.595296223958333, 7.782145182291667, 7.996337890625, 8.210530598958332, 8.397379557291668, 8.529541015625, 8.579671223958334, 7.865315755208333, 7.915445963541667, 8.047607421875, 8.234456380208332, 8.448649088541668, 8.662841796875, 8.849690755208334, 8.981852213541668, 9.031982421875, 8.522705078125, 8.572835286458332, 8.704996744791668, 8.891845703125, 9.106038411458332, 9.320231119791668, 9.507080078125, 9.639241536458334, 9.689371744791668, 9.412516276041666, 9.462646484375, 9.594807942708332, 9.781656901041666, 9.995849609375, 10.210042317708332, 10.396891276041668, 10.529052734375, 10.579182942708334, 10.562093098958332, 10.612223307291666, 10.744384765625, 10.931233723958332, 11.145426432291666, 11.359619140625, 11.546468098958334, 11.678629557291666, 11.728759765625, 11.998779296875, 12.048909505208332, 12.181070963541666, 12.367919921875, 12.582112630208332, 12.796305338541666, 12.983154296875, 13.115315755208334, 13.165445963541666, 7.02734375, 7.121907552083333, 7.284830729166667, 7.48876953125, 7.706380208333333, 7.910319010416667, 8.0732421875, 8.167805989583334, 7.151529947916667, 7.24609375, 7.409016927083333, 7.612955729166667, 7.83056640625, 8.034505208333332, 8.197428385416668, 8.2919921875, 7.426106770833333, 7.520670572916667, 7.68359375, 7.887532552083333, 8.105143229166668, 8.30908203125, 8.472005208333332, 8.566569010416668, 7.87841796875, 7.972981770833333, 8.135904947916668, 8.33984375, 8.557454427083332, 8.761393229166668, 8.92431640625, 9.018880208333334, 8.535807291666668, 8.63037109375, 8.793294270833332, 8.997233072916668, 9.21484375, 9.418782552083332, 9.581705729166668, 9.67626953125, 9.425618489583332, 9.520182291666666, 9.68310546875, 9.887044270833332, 10.104654947916668, 10.30859375, 10.471516927083334, 10.566080729166668, 10.5751953125, 10.669759114583332, 10.832682291666666, 11.03662109375, 11.254231770833334, 11.458170572916666, 11.62109375, 11.715657552083334, 12.011881510416666, 12.1064453125, 12.269368489583332, 12.473307291666666, 12.69091796875, 12.894856770833332, 13.057779947916666, 13.15234375, \n"
]
}
],
"source": [
"for d in u_h.dofVector:\n",
" print(d,end=\", \")\n",
"print()"
]
},
{
"cell_type": "markdown",
"id": "0b605929",
"metadata": {},
"source": [
".. index::\n",
" triple: Models; Schemes; Operators\n",
"\n",
"## Operators and Schemes\n",
"\n",
"In the [previous section](dune-fempy_nb.ipynb) we have already seen how to\n",
"assemble system matrices for linear PDEs and how to construct schemes for\n",
"non-linear problems. We also discussed that we can directly use grid\n",
"functions and ``dune.ufl.Constant`` instances within UFL expressions\n",
"and forms - in the final example of this section we will give an example for this in the\n",
"context of a time dependent problems.\n",
"\n",
".. tip:: The main advantage of using\n",
" ``dune.ufl.Constant`` and grid functions is to be able to change details in\n",
" a form without requiring any recompilation of the model. An example\n",
" would be in a time dependent problem a time varying coefficient or\n",
" changing the time step adaptively during the simulation.\n",
"\n",
"Let us first consider a simple linear elliptic problem\n",
"$$ -\\triangle u + \\alpha u = f $$\n",
"with Dirichlet and Neuman boundary data given by $g_D,g_N$ and\n",
"where $\\alpha$ is a real valued parameter.\n",
"We choose $f,g_N,g_D$ so that the exact solution for $\\alpha=0$\n",
"is given by\n",
"\\begin{align*}\n",
"u(x) = \\left(\\frac{1}{2}(x^2 + y^2) - \\frac{1}{3}(x^3 - y^3)\\right) + 1\n",
"\\end{align*}\n",
"which is the grid function ``exact`` we have already defined above.\n",
"\n",
".. index:: DirichletBC; DirichletBC Definition\n",
"\n",
".. note:: The class `dune.ufl.DirichletBC` is used to fix Dirichlet conditions\n",
" $u=g$ on $\\Gamma\\subset\\partial\\Omega$.\n",
" It constructor takes three arguments: the discrete space for $u$,\n",
" the data $g$, and a description of $\\Gamma$. Multiple\n",
" instances can be used to fix Dirichlet conditions on different parts of the boundary\n",
" as described in the Section on [general boundary conditions](boundary_nb.ipynb).\n",
"\n",
"To assemble a system matrix from a ufl form one can either use\n",
"`dune.fem.assemble` which is especially useful for simple linear models\n",
"as discussed in the [previous section](dune-fempy_nb.ipynb). For more\n",
"control one should use `schemes` or `operators`:\n",
"\n",
".. index:: Scheme; Scheme Definition\n",
"\n",
".. note:: A **scheme** implements a Galerkin scheme for a given\n",
" weak form for a wide range of PDEs, where the model (integrands) is provided as ufl form.\n",
" Mathematically a `scheme` implements an operator $L\\colon V_h\\to V_h$\n",
" with equal (discrete) domain and range space. The `scheme`\n",
" provides a `solve` method which computes $u=L^{-1}(g)$ for\n",
" given $g$. By default a root of $L$ is computed but\n",
" a right hand side $g$ can be provided to solve $L[u_h]=g$.\n",
"\n",
".. index:: Operator; Operator Definition\n",
"\n",
".. note:: The more general case is\n",
" covered by classes in `dune.fem.operator` for **operators** $L\\colon V_h\\to W_h$\n",
" with different domain and range spaces. See\n",
" [here](scheme_api.rst) for more details on the concepts and a summary of the API for operators and\n",
" schemes."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "aa46448a",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:28:21.182985Z",
"iopub.status.busy": "2024-02-29T12:28:21.182657Z",
"iopub.status.idle": "2024-02-29T12:29:11.097059Z",
"shell.execute_reply": "2024-02-29T12:29:11.095627Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of elements: 64 number of dofs: 289 H^1 error: 0.5635700799029998\n"
]
}
],
"source": [
"from ufl import (TestFunction, TrialFunction, SpatialCoordinate, FacetNormal,\n",
" dx, ds, grad, div, inner, dot, sin, cos, pi, conditional)\n",
"from dune.ufl import Constant, DirichletBC\n",
"from dune.fem.scheme import galerkin as solutionScheme\n",
"\n",
"alpha = Constant(1,name=\"mass\") # start with alpha=1\n",
"x = SpatialCoordinate(space)\n",
"u = TrialFunction(space)\n",
"v = TestFunction(space)\n",
"f = -div( grad(exact) )\n",
"g_N = grad(exact)\n",
"n = FacetNormal(space)\n",
"b = f*v*dx + dot(g_N,n)*conditional(x[0]>=1e-8,1,0)*v*ds\n",
"a = dot(grad(u), grad(v)) * dx + alpha*u*v * dx\n",
"dbc = DirichletBC(space,exact,x[0]<=1e-8)\n",
"\n",
"scheme = solutionScheme([a == b, dbc], solver='cg')\n",
"scheme.solve(target = u_h)\n",
"\n",
"h1error = dot(grad(u_h - exact), grad(u_h - exact))\n",
"error = np.sqrt(integrate(h1error))\n",
"print(\"Number of elements:\",gridView.size(0),\n",
" \"number of dofs:\",space.size,\"H^1 error:\", error)"
]
},
{
"cell_type": "markdown",
"id": "844b23b6",
"metadata": {},
"source": [
"\n",
".. index:: Constant; Constant Definition\n",
"\n",
".. note:: The **dune.ufl.Constant** class implements a scalar or vector\n",
" valued constant with a name. This constant can be used within a ufl form\n",
" and after the ufl form was converted into a `scheme` or `operator` the\n",
" given name can be used to change the constant within the form\n",
" efficiently, e.g., we can adapt the point in time or time step during the\n",
" simulation without requiring any additional just in time compilation.\n",
"\n",
"Instances of ``dune.ufl.Constant`` have an attribute\n",
"``value`` to read and change the constant. Setting the value,\n",
"will change it everywhere it is used.\n",
"In addition a ``scheme``/``operator`` provides the attribute ``model``\n",
"which has an attribute ``name`` for each constant\n",
"with name `name` contained in the ufl form used to construct the\n",
"``scheme``/``operator``. Cchanging the value of the constants through\n",
"the ``model`` attribute only changes it within that model and not globally.\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "cc7aaadc",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.103465Z",
"iopub.status.busy": "2024-02-29T12:29:11.102785Z",
"iopub.status.idle": "2024-02-29T12:29:11.110113Z",
"shell.execute_reply": "2024-02-29T12:29:11.109108Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0 1.0\n",
"2.0 1.0\n",
"0.0 0.0\n"
]
}
],
"source": [
"print(scheme.model.mass, alpha.value)\n",
"scheme.model.mass = 2\n",
"print(scheme.model.mass, alpha.value)\n",
"alpha.value = 0\n",
"print(scheme.model.mass, alpha.value)"
]
},
{
"cell_type": "markdown",
"id": "1e1b72be",
"metadata": {},
"source": [
"Note that now $\\alpha=0$ so we have the correct exact solution and can\n",
"compute the errors:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "c1401bd7",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.116745Z",
"iopub.status.busy": "2024-02-29T12:29:11.116232Z",
"iopub.status.idle": "2024-02-29T12:29:11.476239Z",
"shell.execute_reply": "2024-02-29T12:29:11.475116Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of elements: 64 number of dofs: 289 H^1 error: 0.0016470196146885557\n"
]
},
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"scheme.solve(target = u_h)\n",
"\n",
"h1error = dot(grad(u_h - exact), grad(u_h - exact))\n",
"error = np.sqrt(integrate(h1error))\n",
"print(\"Number of elements:\",gridView.size(0),\n",
" \"number of dofs:\",space.size,\"H^1 error:\", error)\n",
"u_h.plot()"
]
},
{
"cell_type": "markdown",
"id": "35c078dc",
"metadata": {},
"source": [
"Or switch to $\\alpha=1$ to directly solve a different PDE without needing\n",
"to recompile anything:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "722c7884",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.481060Z",
"iopub.status.busy": "2024-02-29T12:29:11.480824Z",
"iopub.status.idle": "2024-02-29T12:29:11.706292Z",
"shell.execute_reply": "2024-02-29T12:29:11.705138Z"
}
},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAMgAyAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADrARwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3yV2jhd1ieVlGRGhGW9hkgfmRWTL4ltItOs73ybh47m2N3hVXMcIClnbLdt65AyeeAa1pY1mieNiwVwVJRip/AjkfUVmJ4a0pLOC0EMxggXZGr3MrYTABTJbJQhVyp+U45FAE+o63pOjhDqeqWVkH+59puEi3fTcRmqP/AAm/hP8A6GjRf/A+L/4quL+Oy7/Bumj/AKiif+iZq8Lit89q5q2J9k7WPcyzJnjqftFK2ttj6o/4TXwp/wBDPov/AIHxf/FUv/CaeFf+hm0b/wAD4v8A4qvmSCxZscYFaUVgFjY47GuOeZqPQ9j/AFTileVX8P8Agn0V/wAJl4WP/My6P/4HRf8AxVL/AMJj4X/6GTR//A6L/wCKrwW3sv3acdhV+Ky9q5pZ2o/Z/ExlwzSX/L38P+Ce1/8ACYeGP+hj0j/wOj/+Kpf+Ev8ADJ6eItI/8DY//iq8gisunFT2tn/rOP4zWL4gt9j8f+Ac88hpxf8AE/D/AIJ6x/wl3hr/AKGHSf8AwNj/APiqX/hLfDf/AEMOk/8AgbH/AI15oll7VZSy9qxfEtv+Xf4/8Axlk1Nf8vPw/wCCehf8Jb4bzj/hINKz/wBfsf8AjS/8JX4c/wChg0r/AMDI/wDGvP0s/wDTMY/5Z/1q4tl7VnLii3/Lv8f+AYvK6a+3+H/BO0/4Svw5/wBB/Sv/AAMj/wAaP+Er8OD/AJj+lf8AgZH/AI1yK2ftSXNni1fj0/nUf61629n+P/AM5ZdBfb/D/gnX/wDCVeHf+g9pf/gZH/jR/wAJV4d/6D2l/wDgZH/jXNiy9qeLL2qP9bX/AM+vx/4BDwEP5/wOi/4Snw9/0HtL/wDAyP8AxoHirw6Rka9pf/gZH/jWCLL2qKyswbROPX+dL/W52v7L8f8AgEvBQX2vwOj/AOEp8Pf9B7S//AyP/Gj/AISnw9/0HtL/APAyP/GsUWYHal+xj0pf63v/AJ9fj/wCfqlP+c2f+Ep8PZx/b2l5/wCvyP8Axo/4Sjw9/wBB3TP/AALj/wAawfsg+39P+WX9an+xj0ofF7X/AC6/H/gC+q0/5zX/AOEo8Pf9B3TP/AuP/Gj/AISnw8OuvaX/AOBkf+NZP2QelQXVqP3PH/LVaFxe27ey/H/gC+q0/wCY3f8AhKPD3/Qd0z/wLj/xo/4Sjw9/0HdM/wDAuP8AxrK+yD0o+yD0pf64P/n1+P8AwA+rU/5jV/4Sjw9/0HdM/wDAuP8AxrQtrq3vbdLi0ningfO2SJwytg4OCODyDXNfZB6VpeFht0CMek9wP/Iz17GT528xnKDhy2V97/oY1qUYJcruWtS1vSdG8r+1NUsrHzc+X9quEi34xnG4jOMj8xVFfGvhR2Cr4m0ZmJwAL+Ikn/vqvMP2gF3T+G/926/nDXkOnx41K1P/AE2T+Yr151+WfLY9DDZX7fD+25rb9Ox9eXWqwW9tb3KK1zbzzRwiWBlZV3sEVjkjIyQOMn2qrN4itYtbk0kQzPdJEZcKUG4Bd3ALA47biAueN2au6hpttqcCQ3QlKJIsoEczxncpypypBOCAcdOKr/2Bp/2jz9k/m4+99plznZs3fe+/t43/AHsd66DyCtB4otLhNPdYJgl9K8UTb4jhlYqeA5LD5c5XcMc5xW5WamhafGIQscxWGQyqrXEjKX3FtzAthjuOctk5x6CtKgAooooA82+NUXneFtMQd9TX/wBEzV5Fb2AGOOa9o+LEfmaFpS/9RIf+iZq87gsunFfO5tX5KtvI+84brKngn/if5Iz4LPpxWgtl+6bj+E1pQWXTirwssQvx/Cf5V89UxOp6FfGabmdbWX7pOOwq/FZe1aVpZfuY+P4RWhFZdOK4KuK1PLqYzQyorL2qazs8+bx/y0NbkVl7U+ztVAmz/wA9WrjliW0zzquNSe5QSy9qspZe1aQjRadlR2rHmqS2OGpmC7mYloPt/T/ll/Wri2oFNL/8TD/tl/Wpi9aOhUlY4p5gAgUVDeIotH/D+YqUvVa9f/RH/D+da08FJyVzlnmDfUu/L6UZHpUHmUnmVpHL2c8se+5Y3Cq9k/8Aoifj/Ok8yq9m/wDoifj/ADraOX6bGTx/maG+k31X8yk8yqWXeRDx/mO3/wDEw/7Zf1qffWfv/wBP/wC2X9an8ytHl3kS8d5ljfUF0/8Aqf8ArqtJ5nvVe6f/AFP/AF1WnHL9dhfXvM0N9G+q2+jfS/s7yF9f8yzvq/4X50JD/wBN7j/0c9Y++tbwrz4fj/67z/8Ao56+h4ew3sak33SOjD4j2raPMvjyu648Of7l1/OGvKLKPF9bnH/LVf516/8AG+PzLvw8PSO6/nDXl1vb7LmJicBXBJP1r1MTO1e3ofpGTUVLKub/ABfqfWFFUbrVYLe2t7lFa5t55o4RLAysq72CKxyRkZIHGT7VX1HXotMuzBPZ3RXyJJxKmwqVTGRjduzllHTqa9Y+BNaisEeLLEXdvbSw3EMk0nlESbBsfzDGF+98x3D+HdgEE4BreoAKKZLLHBE8s0ixxopZ3c4CgdSSegqu+q6dHDBM9/arFOdsLmZQsh9FOefwoA5X4lxedpWkpkj/AImI6H/phNXGwab0/eS/99V3njtPMtdIX/qIf+0JqxILXpxXxPEVZwxSXkv1Po8rrcmGa83+hnwab/00l/76q9/Zn7h/3s33T/F7VqQ2vtVmSJUtpP8AcP8AKvlpYiTdkKvikihaaYPIj/fTfdH8XtVxbBV/5bzf991NCwFvHj+4P5UpelGnUm9Tx62N7EX2YDpPP/33Va2g/wBd+/n/ANa38dWi9VbZ/wDXf9dWr0KOEdjy6uM8yUwf9N5/++6YYP8ApvP/AN904vTS9ehSwbOCpjPMrGH/AE//AF83+q/v+9SmD/pvP/33URf/AE//ALZf1qUvXfHBs4543zEMH/Tef/vuq15D/or/AL+bt/H71YL1WvH/ANFf8P511U8E7nK8bqT+T/03m/77pPJ/6bzf990b6TfXRHBGDxr7h5P/AE3m/wC+6r2kP+ip+/m7/wAfvU++oLR/9FT8f51tHBaGbxrtuT+T/wBN5v8Avuk8n/pvN/33Rvo31awXkZvGvuQeT/p3+vm/1X9/3qfyf+m83/fdQb/9O/7Z/wBam31f1LyE8a+4eT/03m/77qC5h/1P7+b/AFq/x1PvqC5f/U/9dBTWCEsa77k/k/8ATeb/AL7o8n/pvN/33Rvo30fUvIX119w8n/pvN/33XS+ERjw3AMk4ln5P/XZ65rfXSeEf+Rbg/wCus/8A6OeujD0PZNs9zIq/tak15HD/ABgTff6CP+mV1/OGvOkgIdT6EV6b8VE8zUtDGOkN1/OGuEaDCk46CvFx9S2Mt6H7Dk9Xlyvl/wAX6nvmoabbanAkN0JSiSLKBHM8Z3KcqcqQTggHHTimvpNlKkiyxNJ5luLZzJIzExjPGSc55OT1PGTwKu0V9IfBmemiWEfkARykQuZEVp5GUuWLbmBbDHJzlskGtCiigCpqVl/aGny2vmeWXwVfbkBgQRkdxkDI71g3XhK4u7SOF9SRSks8hZIGUHzW3sMCTnDbuGypBAZWxmupooA5jxfA0k2it5r7BekeVhdpPkS89M5/HHtUUVsFHSrninfu0fy9u77cfvdP9RNVMtd/9MP1r8/4nhKeOSX8q/NnVTxPsqfKWOFHFQXL/wCjy/7p/lULPd/9MP1qvcPd+RJ/qfun19K83DYHVHmYjGX6lqJ/9Hj/AN0fyoL1Rie78iP/AFP3R6+lBe7/AOmP617VHA6nkVsX5lsvVS3f/Xf9dWqMvdf9Mf1qtbvdfvv9T/rD6161HA6Hm1cXvqaRemF6qF7r/pj+tNL3X/TH9a9Glgjz6mK8yQv/AKd/2z/rUpes0vdfbf8Alj/q/f1qUvdf9Mf1ruhgjkqYrzLheq94/wDor/h/OoTJcjvD+tVbya4Fs/MXb19a6oYLyOf6y3JamrvpN9Zpubj/AKY/rTDdXP8A0x/WumOBfYwdeT6mpvqC0f8A0ZPx/nWebu6/6ZfrVa2u7oW6cxd/X1raOAfYXtJOO5v76TfWKbq69Yv1ppurr1i/WtVl7I5p9zV3j7b1/wCWf9am8wetc79quftnWL/V+/rUv2q59Yv1qlgCpOempu+YPWoLmQfuuf8AloKyftVz6xfrUFxdXH7rmL/WD1p/UBR577nR+YPUUeYPUVg/arn+9F+tH2q5/vRfrT+oC9/ub3mD1Fdb4POfDNuf+ms3/o1680+1XP8Aei/WvR/BJLeErMnGS0pOP+ur1w47D+yimfVcK83tal+y/M5z4kJv1XRR/wBMLn/0KGuNuIQltKx4AQnJ+ld548TfrGjj/p3uf/Qoa5a8gxZTn0jb+VfnmaVLZjb/AA/ofsGXVeXA8vqeo32qC3s7a7tVhuoJriGIus2AFkkVAy4BDYLDjj61R1XxDc6Td3CTaZ/oywNJbz+eP38iruKbQCV7898cAnite8sLPUI1jvbSC5RGDqs0YcBh0IB7+9RDR9MBYjTrPLReSx8heY8AbDx93AAx04FfZHypiW3jOCe90qyeCOK4vZZI5EabaYtvmhSAyhmLGIjBAIzzg4B6iq8VjaW8UMUNrBHHCxaJEjAEZOQSoHQnc3T1PrVigAooooAwPE5w+j/9fx/9ETVTZqteKjg6P/1/H/0RNWezV8lnND2mMT8l+pwYutyOwrNVe4b9xJ/un+VOZqr3DfuJP90/yq8NhDwa+KHRN+4j/wB0fyoLVDE37iP/AHR/KgtXt0cIePWxOo4tVW3b/Xf9dDUhaqkMoXzcn/loa9WjhDzqmJ0ZbLUxnA6mqz3IHSqslz716dLBM45VJSJ3uAL3/tn/AFoe596yXuP9M6/8s/60jXHvXoU8HFDdOTsaD3PvVO8uP9Hfn0/nVVrj3qrdXH7hufT+ddSw6S2NadB8yNU3HvTDce9ZpuPeozce9bqiWsOaRuPeq9vcfuF59f51SNx71XguP3K8+v8AOqVHU2jh/dNk3HvTTce9ZZuPemm496tURrDmh9o/0r/gH9ak+0e9Y32j/Sc5/g/rT/tA9aaolvDmr9o96imuP9Xz/GKzvtNRzXH3P98UOjoOOH1Nn7TR9prK+0mj7SafsRfVzV+016t4FOfB1ifUy/8Aoxq8U+0mvafAJz4J04+ok/8ARjV4eew5acPU+j4cp8lSfoin4wTfrelDHS2uf/Qoa5/UIMaZdHHSF/5Gup8SJ5mvaYP+nW5/9ChrI1aHbo183PFvIen+ya/Gs5qWzW3+H9D9FwtXlw/L6nfUVnX2ptbWdtdQ2/mRS3EMLiUtEyiSRUB2lc5BYcHH1qhe+J/J12XRrK2ju71LSSZYzcrGzyLsKxgEdw+d3Qe/OP0A8Y6Ciubg8UzSXFikulvHHcv5LuHZhHMHdGTITB2lOSSOuRnFdJQAUVS1eS6i0q4ezDeeF+Uou5gM8lV5yQMkDByR0Nc3calr/wBhtTbi73JLOJGayPmTbXHkoRtwgdDy+AFI5wcigC74wkWJNHZzgfbjz/2wmrFa+g/56foa1vGDTCXRgETyfthy+87g3kS4G3GMe+fwrLZq8zFUVOvfyPm84rclW3kQNfQf89P0NQXF7B5Enz/wnsfSrLNVe4b9xJ/un+VduHwx8vWxCuRRXsHkR/P/AAjsfSka+gHWT9DQsoWBOf4R/Kqss+e9e3h8Jc8ypV5mEupwjo/6Gs1NRi/e/vP+Wh7GpJZ/es5Jv9bz/Ga9ilhlGw6dNNO6LT6jF/f/AENVn1CL+/8Aoaieb3qtJN713Qos6YUY9hXv4vtWd/8AB6H1prX8f9/9DVN5v9J6/wAH9aY03vW8KLOxUY6aFlr+P+/+hqtc30Zhb5/0qFpqrXE37pua29i7HRToxutC8b+P+9+lMN8n9/8ASqZmphm962VFmiorsWzfJ/e/SoYr1BEuW/SqxmqGObEYqvYu5qqKtsaJvk/vU03yf3v0qkZvemmb3q1RZSorsWjep5+d/wDD6e9P+3R/3v0rOM377/gNL5w9aI0WW6K7Gh9uT+9+lRyXqHZ838Q7VT873pkk33ef4hRKi7AqKvsaX21P79H21P79Z/nUedVexYvYo0Ptqf369/8Ah227wHpbeqOf/IjV84edX0b8ODn4f6QfWN//AENq+Z4lg40qfq/yPXyimozl6FjWwD4g03P/AD63P/ocNZ+shf7D1D/r2k/9BNX9dOPEGm/9etz/AOhw1m6w3/Ekv/8Ar2k/9BNfiOc0ebNeb/D+h76r8q5TrLyws9QjWO9tILlEYOqzRhwGHQgHv70jafZPCkL2du0SRmJUMQKqhxlQMcD5V46cD0qzRX35JVj0zT4ZIZIrG2R4F2QssSgxrzwpxwOT09atUUUAFFFFAHNeMTiPSP8Ar/P/AKImrDZq2vGhxFpH/X//AO0JqwWaiNLnnc+J4jq8uJS8l+ojNVS7lCwSDvtP8qfNMFHvWXeTfupMn+E17WFwt9WfJubnId537lOf4RVSWb3qHzv3Kf7oqrLN717dKjZG0KOpJLN71nLN/rP980SzVnib/Wc/xmu2FLVHoUqOhbkmqtJP71A81Vnm9664UjshRJHm/f8AX+H+tMaaqTzfvuv8NRtN71vCkdaoltpveq0837s81A03vVeab5DWzpe6zeFHUvGaozN71TM/vUZm962VI1VEumb3qJJsRjmqhmqJZvkHNP2XvI1VHQ0DN70hmqgZvekM1aeyKVEued+9/CnefWd5v7z8KXzqI0tyvYl/zh6015vu896o+cKa03TnvRKloNUTR873o873qh5w9aPOHrVeyF7Ev+d719N/DQ5+HejH/pk3/obV8q+cPWvqj4YnPw30Q/8ATE/+htXyXFsOWjT9X+R3YGHLJljxAca/pn/Xrc/+hQ1l6u+NEvz/ANO8nT/dNaXiQ417TP8Ar1uf/QoayNVb/iT3v/XvJ/6Ca/Hcwoc2O5vQWIrctfl9DpdZ1pdO0+0vVnggjluoYmF2hQsryKpABKlWAJbkHp0qtd+IGj1mK2gvbFrWW2aUSEBvLwu5WJEnKnryqrgj58kA9FRX1B6ZyFl4rvbifRYntwVvLiWKaZLdyhA80IEZSyg/uwT8zAA8ZByOvoooAKKKKAOV8cor22kKwyPt/wD7Qmrl5YIFH3P1NdR44O220g/9P/8A7QmrkJ5cmvSwNHn1Pz/iicljUk/sr82VZoof7n6msy7ji8p/l7HuauTy1mXUn7p/9019FSopLY8WhGV9yvsi8pfl/hHc1VlWL+7+pp5k/dL9BVSWWvQp0l2PSpwdyOVY/T9aoAJ8/H8R71NLLVHzPv8A+8a64UldaHoUoOw5wnp+tV32en60PJVZ5feuuNJdjrhBjX2+b0/h9ajYr6frUTyfvPwqNpK3hSj2OuMGSMV9KglK7DTGkqCST5TWrox5XobwgyclfSmFlqEuTTcmtlSj2NVAkLL6UxWG0cU2kXpR7OPMtC0h5NJmkzSZquWHYLBgbvwpeKbn5vwpc1MVDXQYuKaQOOO9LmkJ6fWlJQtsCFwPSjA9KM0Zqvc7AGB6V9a/C7/kmmhf9cD/AOhNXyVmvrX4Xf8AJNNC/wCuB/8AQmr4/jDl9jSt3f5HRh92SeJzjXdL/wCva5/9ChrG1Rv+JTe/9cH/APQTWt4rONc0v/r2uf8A0KGsPU2/4lN5wT+4fj/gJr8zrUOarzHgZhW5cdy+h6TRWNrOsPpmn2l27wWnmXUMTx3eMlXkVSAQ+AwBLZ5HFZ+o+J2gv7iKxvNPuUjszcFAPmjBAKsWD/OCCWwAPlGcjIz3n1J1NFcjB4m1B73T49tnPFcStFmHG6UCV0MigvkKFVW4DA/NyOCeuoAqale/2fp8t0I/MZMBU3bQWJAGT2GSMntWNeeL4bCxs5biKJJ7i8NqY2nCqu2byncMQMgEggYycjpyR0MsUc8TxSxrJG6lXRxkMD1BHcVDFp1lBAYYbO3jiLq5RIlC7hjBwB1G1cH2HpQBy3xAnVIdIiw+83pbOxtuPJl/ixjPtnNcZPLXZfEgsumaUUxn+0O//XCavPJpLj/pn+tfQ5TG9JvzPguJKfNjk/7q/NhNLWZdS/u3+hp00k//AEz/AFrNupJvLfOzofWvoKcdDgoUtUKZf3a/QVUllqMyS7F+5096qyySf7H613U46bHp06WosstUfM+/z/EaWSSTn7tUTI/zfd6muyMdVod9OloTvLVZ5KjeR/aq7yN3xXXFeR1wpDnk/efhUTS1CzMX7dKT5vatYadDqUEh5YmmN0oyfamsTjtRUqJRehaQ/NJmm5PtSZPtUuv5DsOzSA8U3J9qQE47VhKv7yHYfmjNMyfajJ9ql1wsOz834Uuajyd3bpS5PtUKvuOw/NIT0+tMyfagk8dOtKVfQLD80ZpmT7UZPtT9uFh+a+t/hd/yTPQv+uB/9CavkXJ9q+uvhb/yTLQf+vc/+hNXy3FNTmpU/V/kb0Fqw8XHGt6V/wBe1z/6FDWDqLf8Sy7/AOuL/wDoJra8aOE1rSSf+fe5/wDQoa5y/mB065HrE/8AI18rTw/PDmPic5quOa8v+H9D1aiiiuU++CiiigAooooA4v4knGl6Uf8AqID/ANETV5zM9eh/E040jSj/ANRAf+iJq80mfrX1GSxvQfr/AJHxOfxvjV/hX5srTv1rMuX+RvoatzP1rNuX+Rvoa+jpx0OShAgZ/kX6Cqkr09n+QfSqkj13046HpU4Ecr1RL/e+tTSvVIv97611xjqjvpw0Fd6rM2TSu2aZXUlY64xsJ/F+FGaQn5vwpM1nz2uaWFzTWPFGaax4rmq1PdY0h2aTNJmkzWMqg7C5pAeKM0gPFYSn7w7C5ozSZozSdQLBn5vwpc03PzUZrNTHYdmkJ6fWkzSE9PrRKegWHZozSZozT5wsLmvrv4W/8ky0H/r3P/oTV8h5r68+Fn/JMtB/69z/AOhGvm+I5XpQ9WbUd2UfiDJ5eraOfWC5/wDQoa5G6uM2c4AJ/dtx+FdJ8TpPL1PRDnrDdf8AoUNcTJcbonGeqkVzYCnfB39T4vOKXNmnN/h/Q9k1m9uoNPtLmBL2GU3UIeGKATMUMihwwUPgbNxyCOg57Vl6nqOt+fdvYLebfKZoI/snyiPyNyvkrnzPN+XYTnH8Peutor5s+7OP0+81559LknuLtt0jpPatYkB03uA5lMa7cLt4KqWx05rsKKKACiorm5hs7aS4nfZFGMscE/kByT7DrVNtcsEtYrkyS+TK5QOLeQhWDbSH+X5MNwd2Oh9KAOV+Kb7NE0tsE/8AExHA/wCuM1eWTXH/AEzk/KvU/ipxoel/9hEf+iZq8qmbrX1mRK+Hfq/0PkM7S+tr0X6lCaf/AGH/ACrOuZ/kb5H6elX5m61m3LfI30r6WnF2OejFdio03yD5W6elVZZv9lvyqdm+QfSqkrV3UoO256VOKK8kvs35VTaTJPB6+lWJWqrnk/WuuMXdanfTSsJu9jSFvY04001U211NEMLfN0PSjd7Ggn5vworhcnrqWIW9jTWbjoadTW6VzVZOz1Gg3expN3saWkrGUn3GG72NNDcdDS0g6VjKTvuMXd7Gkz7Giipcn3ATPzdDS59jSd6XNQpPuMM+1IT04pc0h7UpSdtwFz7GjPsaTNGafM+4C59jX178LP8AkmOg/wDXv/7Ma+Qc19ffCz/kmOg/9e//ALMa8HPm3Thfua0tzn/i3J5eoaEfWK6/nDXnwuNxA9eK7f40SeXe+Hz6x3X84a8ziuCZkA5JYYzXblVO+XX/AMX6nzmYUubHc3ofU1Fc/wCILrWILGFrRJI5ykhItY/PzKF/docr9wnq2BjjkZqlq1/4gS+mfShJNC9s0kcb2zKI/wB0SvWMZffjjfnBxsGM18YfUnW0VyFpfa8ZrRJWu3G9VVjZ7FuF85lkaT5f3eIwrKMrkn+KuvoAr31nHf2cltKzKrgfMh+ZSDkEZ7ggH8KzP+EcTyoIv7TvvLhuWuth8rEjs247hs5G4lgOxPHRcbdFAHn/AMV4l/snSpsvuF+FxvO3Hky/w5xn3xmvKp2616v8WONB0v8A7CI/9EzV5JM1fYZAv9nfq/0Pk85V8WvRfqU5mrNuG+RvpV2ZutZ1w3yt9K+nprQxoxKrt8g+lVJGqd2+UfSqkhrvpLRHpU4leU1AO/1qRzk1GO/1ro2aO2K0A000ppprCpIpDT978KKD978KSuFy3LCmt0paa3SuWpLRjQtJRSVlKQwpB0paaOlYSlqMdmkopM1LkAd6Wm96WoUhi0h7UUh7USloA7NGaSijmAXNfX3ws/5JjoP/AF7/APsxr5Ar6/8AhZ/yTHQf+vf/ANmNeJnbvCHqaU9zi/jrJ5dz4dOeqXX84a8qtLjdewDPWRR+tel/tBSeXN4bPqt1/wC0a8g06fOp2g9Zk/mK9/Jad8pv5S/U8/E0uavzeh9m0UUV+enrBRRRQAUUUUAef/FxQ3h7TARx/aK/+iZq8fmij/u/rXsPxb/5F/S/+wiP/RM1eQTdTX2XD6Twz9X+h8tm7f1pei/UzZo0/u/rWfcRptbA7etaUxrOuPut9K+nhFW2M6LZQdF2jjtVSRV54q25+UfSqsp613UoRstD0adyqVGelM2jn61IetM9frWk4x00OpDSBSECnGmmuWpGPYpDCBu/CggUp+9+FJXC4rXQoTAprAYp1NPSuaolZ6FIMCkwKWkrFpdhiYFIAMU6mjpWMkrjDAowKWipaQDcDNGBR3pahJDEwKCBS0h7UpJWAMCjApaKdkAmBX2D8K/+SY6B/wBe/wD7Ma+P6+wPhX/yTDQP+vf/ANmNeNnNuSNu5pT3PPP2ijiTwz9Lv/2jXjOmMf7Vs8cnz0xk/wC0K9k/aMOJPDP0u/8A2jXjGlN/xN7L/rvH/wChCvoslrcuU8v+L9TGov3h9eeILfWLqxh+yJIs+yQFLW527JSv7tix27kB6jHORwcVVmt9al8RPdGC9Fg8JHkrcBcZi6cSgBt/HAznnzMfLXVUV+enWchYabrUU+lyytqXmxSSCVXulMHlGRyN672YuFIxy2PlyTg119FFABRVLV47qXSriOzLCcr8oRtrEZ5CtxgkZAORgnqK52a016TToo4475HQ3Kx5u13KzMDA7sH+dEUlWBLEkdG4NAGd8W/+Rf0v/sIj/wBEzV5BMete8eMvDNz4ohsLVLuO3t4bnzpD5W5v9W6jHzAYyw4x75rl2+DyN11x/wDwFH/xVfR5TmeHwtHkqXve+3oeHmGArV6/PDax4/NWbcH5G+le2N8FYW667J/4DD/4qoX+Bls4IOvTc/8ATsP/AIqvbjxFgkt39xFPLq0d7Hhb/dH0qpL3r3o/ASzI/wCQ/cf+A6//ABVV7n4AWwt5Wh1yd5QhKIYFUM2OATnjmuqHE+Xpat/cdsMLUW54Kab6/Wvff+GerD/oYLr/AMB1/wAaT/hnnT/+hguv/Adf8aqfFOXu1m/uNlQmeBGmmvf/APhnjT/+hguv/Adf8aT/AIZ307/oYLr/AMB1/wAa558SYF7N/cP2Mj5/P3vwpK+gP+GdtOzn/hIbr/wHX/Go4/2d7NnlEmu3KqHxGRCp3LtHJ545yPwrlef4Pu/uK9lI8Cpp6V9B/wDDOunf9DDd/wDgOv8AjSH9nTTT/wAzDd/+A6/41jPPMK1o39w/ZyPn2kr6D/4Z003/AKGG7/8AAdf8aP8AhnPTf+hhu/8AwHX/ABrN5zhfP7g9nI+ezSDpX0C37Otl9oRRrtyYijFn8lchsjAxnuC35e9P/wCGctNH/Mw3f/fhf8azeb4Zvr9w/Zs+fKSvoT/hnPTf+hhu/wDvwv8AjR/wzlpv/Qw3f/fhf8aX9rYbz+4PZs+eu9LX0J/wzlpv/Qw3f/fhf8ajm/Z0slQGHXrp23qCDCo+UsNx69hk/hULNcP5/cPkZ8/0h7fWvoX/AIZy03/oYbv/AL8L/jR/wzlpv/Qw3f8A34X/ABoea4e3X7g5GfPdFfQn/DOWm/8AQw3f/fhf8aP+GctN/wChhu/+/C/40/7Vw/n9wcjPnuvsD4V/8kw0D/r3/wDZjXB/8M5ab/0MN3/34X/GvUfCOiP4c8L2ejvJ5v2TfGr4xuTe20keu3GfevOzHGUsRGKh0LhFrc8j/aPOH8MfS7/9o14tpLf8Tmx/6+I//QhX1V8QfhxbfEA6cbjUJrP7D5u3y4w27fsznPpsH51x1v8As82FtcxTx+ILkvE4dd1upGQcjPNdODzOnRwvsZb6/iTKDcrns9Fc/wCILXWJ7GFLR5JJwkgJtZPIxKV/duct9wHquTnjg4qWayuLnV1vTHfRQCybfAt2V8yRuAoUPtDKAeeBlwQeM14BqbdFcjZWmvGLRzPHepLFb2ySF7pSEdG/fmUBz5m9MBT83PPynmuuoAKKKKAORh8NX8UV7Dtsik4i3fvG/wBIZJS5Mg2f8tFYq3XGB94HjoNHspNP0yO2l2BlZ2CRnKRhnLBF4HCghRwOB0HSr1FABRRRQAVgXOjXbeJ4dTiW2dFkVi7uVkCbGRoxhT8uW39eWGMdxv0UAY3h/TJ9OW8e4trO2e4m8wR2bkxgYwONi84Ayecn0GANmiigAooooAzdb0+TUbKOJI4JgkyyNBcHEcoH8LHB+vQ8gVkR+HtUM/h2WW8tiNLAV42Vn3YjeMurZHzMGXgj5ecE856migAooooAKiuomntJoUkMTyIyrIvVSRjI+lS0UAcb/wAIrevpT2MlvZLbm5Sf7JFcOkbgRbChITKjcBJkA5JI9z1djDLb2FtDPIJZo4lR5Au0MwABIHbJ7VPRQAUUUUAFcu+gX41S+uIhabbmK4jMzSMHfzApTcAOdhTaPm6MSCCMHqKKAMXwxpE+i6Y9tP5QJlLqIiCACAP4URc5B6Ko+pyTtUUUAFFFFAGTr+n3GoWtstrBayzQ3cM4a4cpsCSKxKkKxyQCO3XrVaLRrw+IU1OVbZSXEjujlpAPJ2GAfKMx7vnzkc/w9636KACiiigAooooAKKKKAP/2Q==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"alpha.value = 1\n",
"scheme.solve(target = u_h)\n",
"u_h.plot()"
]
},
{
"cell_type": "markdown",
"id": "245e7430",
"metadata": {},
"source": [
".. tip:: Changing the values of constants using the ``value`` attribute\n",
" on ``dune.ufl.Constant`` is generally the option with the least chance\n",
" for surprise.\n",
" The ``scheme.model.name`` approach is useful if the instance of\n",
" ``dune.ufl.Constant`` is not available anymore, e.g., a ``scheme`` was\n",
" returned by some function which constructed the constants as local\n",
" variables."
]
},
{
"cell_type": "markdown",
"id": "019f3bfe",
"metadata": {},
"source": [
".. index:: Equations; Non-linear parabolic\n",
"\n",
"## A Nonlinear Time Dependent Problem\n",
"\n",
"As a final example in this section we will study the Forchheimer problem\n",
" \n",
"which is a scalar, nonlinear parabolic equation\n",
"\\begin{equation}\n",
"\\partial_tu - \\nabla\\cdot K(\\nabla u)\\nabla u = f\n",
"\\end{equation}\n",
"where the diffusion tensor is given by\n",
"\\begin{equation}\n",
"K(\\nabla u) = \\frac{2}{1+\\sqrt{1+4|\\nabla u|}}\n",
"\\end{equation}\n",
"and $f=f(x,t)$ is some time dependent forcing term.\n",
"On the boundary we prescribe Neumann boundary\n",
"and initial conditions $u=u_0$.\n",
"\n",
"We will solve this problem in variational form and using the Crank\n",
"Nicolson method for the time discretization\n",
"\n",
"\\begin{equation}\n",
"\\begin{split}\n",
"\\int_{\\Omega} \\frac{u^{n+1}-u^n}{\\Delta t} \\varphi\n",
"+ \\frac{1}{2}K(\\nabla u^{n+1}) \\nabla u^{n+1} \\cdot \\nabla \\varphi \\\n",
"+ \\frac{1}{2}K(\\nabla u^n) \\nabla u^n \\cdot \\nabla \\varphi v\\ dx \\\\\n",
"- \\int_{\\Omega} \\frac{1}{2}(f(x,t^n)+f(x,t^n+\\Delta t) \\varphi\\ dx\n",
"- \\int_{\\partial \\Omega} \\frac{1}{2}(g(x,t^n)+g(x,t^n+\\Delta t)) v\\ ds = 0.\n",
"\\end{split}\n",
"\\end{equation}\n",
"\n",
"on a domain $\\Omega=[0,1]^2$. We choose $f,g$ so that the exact solution\n",
"is given by\n",
"\\begin{align*}\n",
"u(x,t) = e^{-2t}\\left(\\frac{1}{2}(x^2 + y^2) - \\frac{1}{3}(x^3 - y^3)\\right) + 1\n",
"\\end{align*}\n",
"We solve this problem using a quadratic finite element space.\n",
"We first setup this space, define the initial data,\n",
"and a second discrete function to store\n",
"the solution at the current time step (``u_h`` will be used to store the\n",
"next time step):"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "bc17aeba",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.715267Z",
"iopub.status.busy": "2024-02-29T12:29:11.715027Z",
"iopub.status.idle": "2024-02-29T12:29:11.759211Z",
"shell.execute_reply": "2024-02-29T12:29:11.758017Z"
}
},
"outputs": [],
"source": [
"space = solutionSpace(gridView, order=2)\n",
"u_h = space.interpolate(0, name='u_h')\n",
"u_h_n = u_h.copy(name=\"previous\")\n",
"\n",
"x = SpatialCoordinate(space)\n",
"initial = 1/2*(x[0]**2+x[1]**2) - 1/3*(x[0]**3 - x[1]**3) + 1"
]
},
{
"cell_type": "markdown",
"id": "2ed86e1d",
"metadata": {},
"source": [
"Next we setup the form $a=a(u,v)$ which depends on time $t$ and the\n",
"chosen time step $\\Delta t$. Since we want to be able to change these\n",
"during the simulation (we need to do this for $t$ and might want to do\n",
"this for $\\Delta t$ we use the ``dune.ufl.Constant`` which stores a\n",
"mutable scalar and can be used within a ufl expression:"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "c04a4bf6",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.764202Z",
"iopub.status.busy": "2024-02-29T12:29:11.763967Z",
"iopub.status.idle": "2024-02-29T12:29:11.771513Z",
"shell.execute_reply": "2024-02-29T12:29:11.770567Z"
}
},
"outputs": [],
"source": [
"from dune.fem.scheme import galerkin as solutionScheme\n",
"from ufl import FacetNormal, ds, dx, inner, dot, div, grad, sqrt, exp, TrialFunction, TestFunction\n",
"from dune.ufl import Constant\n",
"dt = Constant(0, name=\"dt\") # time step\n",
"t = Constant(0, name=\"t\") # current time\n",
"u = TrialFunction(space)\n",
"v = TestFunction(space)\n",
"\n",
"abs_du = lambda u: sqrt(inner(grad(u), grad(u)))\n",
"K = lambda u: 2/(1 + sqrt(1 + 4*abs_du(u)))\n",
"a = ( dot((u - u_h_n)/dt, v) \\\n",
" + 0.5*dot(K(u)*grad(u), grad(v)) \\\n",
" + 0.5*dot(K(u_h_n)*grad(u_h_n), grad(v)) ) * dx"
]
},
{
"cell_type": "markdown",
"id": "2a8e1fc2",
"metadata": {},
"source": [
"To define the right hand side we use the given function $u$ to define\n",
"the forcing $f$ and the boundary flux $g$"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "d122fbe8",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.775926Z",
"iopub.status.busy": "2024-02-29T12:29:11.775704Z",
"iopub.status.idle": "2024-02-29T12:29:11.784526Z",
"shell.execute_reply": "2024-02-29T12:29:11.783612Z"
}
},
"outputs": [],
"source": [
"exact = lambda t: exp(-2*t)*(initial - 1) + 1\n",
"f = lambda s: -2*exp(-2*s)*(initial - 1) - div( K(exact(s))*grad(exact(s)) )\n",
"g = lambda s: K(exact(s))*grad(exact(s))\n",
"n = FacetNormal(space)\n",
"b = 0.5*(f(t)+f(t+dt))*v*dx + 0.5*dot(g(t)+g(t+dt),n)*v*ds"
]
},
{
"cell_type": "markdown",
"id": "78ba8a4f",
"metadata": {},
"source": [
"With the model described as a ufl form, we can again construct a scheme class\n",
"that provides the solve method which we can use to evolve the solution from\n",
"one time step to the next. As already mentioned the solve methods always assumes\n",
"that the problem is non-linear and use a Newton method to solve the problem:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "3a192a78",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.789090Z",
"iopub.status.busy": "2024-02-29T12:29:11.788870Z",
"iopub.status.idle": "2024-02-29T12:29:11.896104Z",
"shell.execute_reply": "2024-02-29T12:29:11.894852Z"
}
},
"outputs": [],
"source": [
"scheme = solutionScheme(a == b, solver='cg')"
]
},
{
"cell_type": "markdown",
"id": "26095c95",
"metadata": {},
"source": [
"\n",
"Optionally, we may want to increase the default quadrature orders which are\n",
"`2 * space.order` for element integrals and `2 * space.order + 1` for surface\n",
"integrals. Depending on the data this might not be enough. Then we simply\n",
"set the integration orders by hand like in the following example, by calling\n",
"the method setQuadratureOrders(interiorOrder, surfaceOrder)."
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "19b67a31",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.901016Z",
"iopub.status.busy": "2024-02-29T12:29:11.900785Z",
"iopub.status.idle": "2024-02-29T12:29:11.905343Z",
"shell.execute_reply": "2024-02-29T12:29:11.904239Z"
}
},
"outputs": [],
"source": [
"#scheme.setQuadratureOrders( 2*space.order, 2*space.order+1 )"
]
},
{
"cell_type": "markdown",
"id": "3d445e36",
"metadata": {},
"source": [
"\n",
".. index:: Experimental Order of Convergence (EOC)\n",
"\n",
"Since we have forced the system towards a given solution, we can compute\n",
"the discretization error. First we define ufl expressions for the $L^2$\n",
"and $H^1$ norms and will use those to compute the experimental order of\n",
"convergence of the scheme by computing the time evolution on different grid\n",
"levels. We use ``dune.fem.function.gridFunction`` to generate code for the\n",
"errors which can be more efficient than using the ufl expressions\n",
"directly."
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "191cfa09",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:11.909975Z",
"iopub.status.busy": "2024-02-29T12:29:11.909757Z",
"iopub.status.idle": "2024-02-29T12:29:12.126913Z",
"shell.execute_reply": "2024-02-29T12:29:12.125729Z"
}
},
"outputs": [],
"source": [
"endTime = 0.25\n",
"exact_end = exact(endTime)\n",
"l2error = gridFunction(dot(u_h - exact_end, u_h - exact_end), name=\"l2error\")\n",
"h1error = gridFunction(dot(grad(u_h - exact_end), grad(u_h - exact_end)), name=\"h1error\")"
]
},
{
"cell_type": "markdown",
"id": "c3fa5fa4",
"metadata": {},
"source": [
".. index::\n",
" pair: I/O; VTK files\n",
"\n",
"Now we evolve the solution from time $t=0$ to $t=T$ in a loop. Since the\n",
"PDE model has time dependent coefficient (through the forcing term), we\n",
"need to update the `t` constant used to define the model before each step.\n",
"A second constant we used to define the model was `dt` which defines the\n",
"time step. We keep this constant and set it to $0.002$ at the beginning\n",
"of the simulation. This value could be changed in each time step:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "1e1c46bf",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:12.131838Z",
"iopub.status.busy": "2024-02-29T12:29:12.131622Z",
"iopub.status.idle": "2024-02-29T12:29:12.486126Z",
"shell.execute_reply": "2024-02-29T12:29:12.485060Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"grid size: 64\n",
"\t | u_h - u | = 1.98216e-05\n",
"\t | grad(uh - u) | = 9.99185e-04\n"
]
},
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dt.value = 0.01\n",
"time = 0\n",
"u_h.interpolate(initial)\n",
"while time < (endTime - 1e-6):\n",
" t.value = time\n",
" u_h_n.assign(u_h)\n",
" scheme.solve(target=u_h)\n",
" time += dt.value\n",
"\n",
"errors = [np.sqrt(e) for e in integrate([l2error,h1error])]\n",
"print('grid size:', gridView.size(0))\n",
"print('\\t | u_h - u | =', '{:0.5e}'.format(errors[0]))\n",
"print('\\t | grad(uh - u) | =', '{:0.5e}'.format(errors[1]))\n",
"u_h.plot()\n",
"gridView.writeVTK('forchheimer', pointdata={'u': u_h, 'l2error': l2error, 'h1error': h1error})"
]
},
{
"cell_type": "markdown",
"id": "63ff78f6",
"metadata": {},
"source": [
"We can refine the grid once and recompute the solution on the finer grid."
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "9838d259",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:12.491070Z",
"iopub.status.busy": "2024-02-29T12:29:12.490852Z",
"iopub.status.idle": "2024-02-29T12:29:13.161552Z",
"shell.execute_reply": "2024-02-29T12:29:13.160826Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"grid size: 256\n",
"\t | u_h - u | = 2.69665e-06\n",
"\t | grad(uh - u) | = 2.49777e-04\n"
]
},
{
"data": {
"image/jpeg": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"globalRefine(1, gridView.hierarchicalGrid)\n",
"dt.value /= 2\n",
"u_h.interpolate(initial)\n",
"time = 0\n",
"while time < (endTime - 1e-6):\n",
" t.value = time\n",
" u_h_n.assign(u_h)\n",
" scheme.solve(target=u_h)\n",
" time += dt.value\n",
"\n",
"errorsFine = [np.sqrt(e) for e in integrate([l2error,h1error])]\n",
"print('grid size:', gridView.size(0))\n",
"print('\\t | u_h - u | =', '{:0.5e}'.format(errorsFine[0]))\n",
"print('\\t | grad(uh - u) | =', '{:0.5e}'.format(errorsFine[1]))\n",
"u_h.plot()"
]
},
{
"cell_type": "markdown",
"id": "54a7b2de",
"metadata": {},
"source": [
"To check that everything is working as expected let's compute the\n",
"**experimental order of convergence** (convergence should be cubic for\n",
"$L^2$-error and quadratic for the $H^1$-error:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "ea7e4cb5",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:13.164678Z",
"iopub.status.busy": "2024-02-29T12:29:13.164452Z",
"iopub.status.idle": "2024-02-29T12:29:13.168417Z",
"shell.execute_reply": "2024-02-29T12:29:13.167861Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"EOCs: [2.88, 2.0]\n"
]
}
],
"source": [
"eocs = [ round(np.log(fine/coarse)/np.log(0.5),2)\n",
" for fine,coarse in zip(errorsFine,errors) ]\n",
"print(\"EOCs:\",eocs)"
]
},
{
"cell_type": "markdown",
"id": "13110efb",
"metadata": {},
"source": [
".. index:: Grids; Available Grids\n",
"\n",
"## Listing Available Dune Components\n",
"The available realization of a given interface, i.e., the available\n",
"grid implementations, depends on the modules found during configuration.\n",
"Getting access to all available components is straightforward:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "ae044e46",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:13.171413Z",
"iopub.status.busy": "2024-02-29T12:29:13.171192Z",
"iopub.status.idle": "2024-02-29T12:29:13.175944Z",
"shell.execute_reply": "2024-02-29T12:29:13.175397Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"available categories are:\n",
" discretefunction,function,grid,model,operator,scheme,solver,space,view\n",
"available entries for this category are:\n",
"entry function module \n",
"----------------------------------------------\n",
"agglomerate polyGrid dune.vem.vem \n",
"alberta albertaGrid dune.grid \n",
"alu aluGrid dune.alugrid \n",
"aluconform aluConformGrid dune.alugrid \n",
"alucube aluCubeGrid dune.alugrid \n",
"alusimplex aluSimplexGrid dune.alugrid \n",
"mmesh mmesh dune.mmesh \n",
"oned onedGrid dune.grid \n",
"polygon polygonGrid dune.polygongrid\n",
"sp spIsotropicGrid dune.spgrid \n",
"spanisotropic spAnisotropicGrid dune.spgrid \n",
"spbisection spBisectionGrid dune.spgrid \n",
"spisotropic spIsotropicGrid dune.spgrid \n",
"ug ugGrid dune.grid \n",
"yasp yaspGrid dune.grid \n",
"----------------------------------------------\n"
]
}
],
"source": [
"from dune.utility import components\n",
"# to get a list of all available components:\n",
"components()\n",
"# to get for example all available grid implementations:\n",
"components(\"grid\")"
]
},
{
"cell_type": "markdown",
"id": "dac4ad78",
"metadata": {},
"source": [
".. index:: Spaces; Available Spaces\n",
"\n",
"Available discrete function spaces are:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "4e9ad164",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:13.179097Z",
"iopub.status.busy": "2024-02-29T12:29:13.178814Z",
"iopub.status.idle": "2024-02-29T12:29:13.182919Z",
"shell.execute_reply": "2024-02-29T12:29:13.182242Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"available entries for this category are:\n",
"entry function module \n",
"------------------------------------------------\n",
"bbdg bbdgSpace dune.vem.vem \n",
"bdm bdm dune.fem.space\n",
"combined combined dune.fem.space\n",
"composite composite dune.fem.space\n",
"dglagrange dglagrange dune.fem.space\n",
"dglagrangelobatto dglagrangelobatto dune.fem.space\n",
"dglegendre dglegendre dune.fem.space\n",
"dglegendrehp dglegendrehp dune.fem.space\n",
"dgonb dgonb dune.fem.space\n",
"dgonbhp dgonbhp dune.fem.space\n",
"finitevolume finiteVolume dune.fem.space\n",
"lagrange lagrange dune.fem.space\n",
"lagrangehp lagrangehp dune.fem.space\n",
"p1bubble p1Bubble dune.fem.space\n",
"product product dune.fem.space\n",
"rannacherturek rannacherTurek dune.fem.space\n",
"raviartthomas raviartThomas dune.fem.space\n",
"vem vemSpace dune.vem.vem \n",
"------------------------------------------------\n"
]
}
],
"source": [
"components(\"space\")"
]
},
{
"cell_type": "markdown",
"id": "8e89c3ae",
"metadata": {},
"source": [
".. index:: Functions; Available Functions\n",
"\n",
"Available grid functions are:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "6fb65f43",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:13.186211Z",
"iopub.status.busy": "2024-02-29T12:29:13.185676Z",
"iopub.status.idle": "2024-02-29T12:29:13.189696Z",
"shell.execute_reply": "2024-02-29T12:29:13.188925Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"available entries for this category are:\n",
"entry function module \n",
"----------------------------------------------\n",
"discrete discreteFunction dune.fem.function\n",
"gridfunction gridFunction dune.fem.function\n",
"levels levelFunction dune.fem.function\n",
"partitions partitionFunction dune.fem.function\n",
"----------------------------------------------\n"
]
}
],
"source": [
"components(\"function\")"
]
},
{
"cell_type": "markdown",
"id": "752d88e9",
"metadata": {},
"source": [
".. index:: Scheme; Available Schemes\n",
"\n",
"Available schemes:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "c9a1e9eb",
"metadata": {
"execution": {
"iopub.execute_input": "2024-02-29T12:29:13.192776Z",
"iopub.status.busy": "2024-02-29T12:29:13.192565Z",
"iopub.status.idle": "2024-02-29T12:29:13.195984Z",
"shell.execute_reply": "2024-02-29T12:29:13.195348Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"available entries for this category are:\n",
"entry function module \n",
"-----------------------------------------\n",
"bbdg bbdgScheme dune.vem.vem \n",
"dg dg dune.fem.scheme\n",
"dggalerkin dgGalerkin dune.fem.scheme\n",
"galerkin galerkin dune.fem.scheme\n",
"h1 h1 dune.fem.scheme\n",
"h1galerkin h1Galerkin dune.fem.scheme\n",
"linearized linearized dune.fem.scheme\n",
"rungekutta rungeKuttaSolver dune.femdg \n",
"vem vemScheme dune.vem.vem \n",
"-----------------------------------------\n"
]
}
],
"source": [
"components(\"scheme\")"
]
}
],
"metadata": {
"jupytext": {
"cell_metadata_filter": "-all"
},
"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.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}