--- /srv/reproducible-results/rbuild-debian/r-b-build.HzlvVOMf/b1/fenics-dolfinx_0.9.0-5_i386.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.HzlvVOMf/b2/fenics-dolfinx_0.9.0-5_i386.changes ├── Files │ @@ -1,9 +1,9 @@ │ │ - 03c42727f292279aead059af32f15496 1236916 doc optional dolfinx-doc_0.9.0-5_all.deb │ + 7ffb16fba72e713fe3afb2f450718cc5 1236920 doc optional dolfinx-doc_0.9.0-5_all.deb │ 6db69c2cb006a94e746c51d5ed38bf73 48520 libdevel optional libdolfinx-complex-dev_0.9.0-5_i386.deb │ 643f8e715d5cb18c97c25d8260903605 10995892 debug optional libdolfinx-complex0.9-dbgsym_0.9.0-5_i386.deb │ 856634f94ebd291c0775f55ae82121ef 595764 libs optional libdolfinx-complex0.9_0.9.0-5_i386.deb │ c1905ac570198068f9069c41addd3310 201520 libdevel optional libdolfinx-dev_0.9.0-5_i386.deb │ 39ac8ea6604d5277f36278705339e254 48508 libdevel optional libdolfinx-real-dev_0.9.0-5_i386.deb │ d87b17df26785fb68171ff7d022b6040 10994160 debug optional libdolfinx-real0.9-dbgsym_0.9.0-5_i386.deb │ 37ecd9b2106f703d03fd5403d35405e2 595968 libs optional libdolfinx-real0.9_0.9.0-5_i386.deb ├── dolfinx-doc_0.9.0-5_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2024-12-02 15:55:08.000000 debian-binary │ │ --rw-r--r-- 0 0 0 21928 2024-12-02 15:55:08.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 1214796 2024-12-02 15:55:08.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 21924 2024-12-02 15:55:08.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 1214804 2024-12-02 15:55:08.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -905,17 +905,17 @@ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/56ce7e71d8c71b4d8ef7c699176dd4fd/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 19507 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/56ce7e71d8c71b4d8ef7c699176dd4fd/demo_stokes.py │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/67f8546536727bd5386a27073bd16e12/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 8141 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/67f8546536727bd5386a27073bd16e12/demo_elasticity.py │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/6ad57720b461988475bd5c9286e3f111/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7325 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/6ad57720b461988475bd5c9286e3f111/demo_types.py │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/9561cf6cd1a70079b986f4eb31580cbd/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3864 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/9561cf6cd1a70079b986f4eb31580cbd/demo_poisson_matrix_free.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3866 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/9561cf6cd1a70079b986f4eb31580cbd/demo_poisson_matrix_free.ipynb.gz │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 2723 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 2719 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb.gz │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/b94ac7be61dc3726ca331afd20f195d2/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5886 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/b94ac7be61dc3726ca331afd20f195d2/demo_poisson.py │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/e8140d02a100265518e126a3cfe79d8e/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3877 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/e8140d02a100265518e126a3cfe79d8e/demo_interpolation-io.py │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/e8b180b39a27d7b04c2f666d14475ee3/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 11424 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/e8b180b39a27d7b04c2f666d14475ee3/demo_cahn-hilliard.py │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-12-02 15:55:08.000000 ./usr/share/doc/dolfinx-doc/python/_downloads/f6f3cc4d9540871af057920d1ddb5561/ │ │ │ ├── ./usr/share/doc/dolfinx-doc/python/_downloads/9561cf6cd1a70079b986f4eb31580cbd/demo_poisson_matrix_free.ipynb.gz │ │ │ │ ├── demo_poisson_matrix_free.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9876077586206897% │ │ │ │ │ │┄ Differences: {"'cells'": "{0: {'id': 'b75f4c45'}, 1: {'id': '69a5d155'}, 2: {'id': '0639e63c'}, 3: {'id': " │ │ │ │ │ │┄ "'c218cd23'}, 4: {'id': '4383f228'}, 5: {'id': 'c6b77459'}, 6: {'id': 'b70e4c73'}, 7: " │ │ │ │ │ │┄ "{'id': '28d0718d'}, 8: {'id': '77f987e9'}, 9: {'id': '4d953804'}, 10: {'id': " │ │ │ │ │ │┄ "'b2fde44b'}, 11: {'id': '86aab5b3'}, 12: {'id': '5fd38d9c'}, 13: {'id': '3b7feae3'}, " │ │ │ │ │ │┄ "14: {'id': '547b0904'}, 15: {'id': 'c12d4f6b'}, 16: {'id': 'e62f96d8'}, 17: {'id': " │ │ │ │ │ │┄ "'f36436e1'}, 1 […] │ │ │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ │ │ { │ │ │ │ │ │ "cells": [ │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "90131e3d", │ │ │ │ │ │ + "id": "b75f4c45", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Matrix-free conjugate gradient solver for the Poisson equation\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "This demo illustrates how to solve the Poisson equation using a\n", │ │ │ │ │ │ "matrix-free conjugate gradient (CG) solver. In particular, it\n", │ │ │ │ │ │ "illustrates how to\n", │ │ │ │ │ │ @@ -68,84 +68,84 @@ │ │ │ │ │ │ "\n", │ │ │ │ │ │ "The modules that will be used are imported:" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "70e3bd59", │ │ │ │ │ │ + "id": "69a5d155", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "from mpi4py import MPI" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "f0ba86d6", │ │ │ │ │ │ + "id": "0639e63c", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "import numpy as np" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "06820f7e", │ │ │ │ │ │ + "id": "c218cd23", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "import dolfinx\n", │ │ │ │ │ │ "import ufl\n", │ │ │ │ │ │ "from dolfinx import fem, la\n", │ │ │ │ │ │ "from ufl import action, dx, grad, inner" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "8f868cca", │ │ │ │ │ │ + "id": "4383f228", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "We begin by using {py:func}`create_rectangle\n", │ │ │ │ │ │ "` to create a rectangular\n", │ │ │ │ │ │ "{py:class}`Mesh ` of the domain, and creating a\n", │ │ │ │ │ │ "finite element {py:class}`FunctionSpace `\n", │ │ │ │ │ │ "on the mesh." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "3c3b7ebf", │ │ │ │ │ │ + "id": "c6b77459", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "dtype = dolfinx.default_scalar_type\n", │ │ │ │ │ │ "real_type = np.real(dtype(0.0)).dtype\n", │ │ │ │ │ │ "comm = MPI.COMM_WORLD\n", │ │ │ │ │ │ "mesh = dolfinx.mesh.create_rectangle(comm, [[0.0, 0.0], [1.0, 1.0]], [10, 10], dtype=real_type)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "fd805e44", │ │ │ │ │ │ + "id": "b70e4c73", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Create function space\n", │ │ │ │ │ │ "degree = 2\n", │ │ │ │ │ │ "V = fem.functionspace(mesh, (\"Lagrange\", degree))" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "f7199b5d", │ │ │ │ │ │ + "id": "28d0718d", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "The second argument to {py:class}`functionspace\n", │ │ │ │ │ │ "` is a tuple consisting of `(family,\n", │ │ │ │ │ │ "degree)`, where `family` is the finite element family, and `degree`\n", │ │ │ │ │ │ "specifies the polynomial degree. In this case `V` consists of\n", │ │ │ │ │ │ "third-order, continuous Lagrange finite element functions.\n", │ │ │ │ │ │ @@ -156,94 +156,94 @@ │ │ │ │ │ │ "and then retrieving all facets on the boundary using\n", │ │ │ │ │ │ "{py:func}`exterior_facet_indices `." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "ff892017", │ │ │ │ │ │ + "id": "77f987e9", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "tdim = mesh.topology.dim\n", │ │ │ │ │ │ "mesh.topology.create_connectivity(tdim - 1, tdim)\n", │ │ │ │ │ │ "facets = dolfinx.mesh.exterior_facet_indices(mesh.topology)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "1772ec38", │ │ │ │ │ │ + "id": "4d953804", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "We now find the degrees of freedom that are associated with the boundary\n", │ │ │ │ │ │ "facets using\n", │ │ │ │ │ │ "{py:func}`locate_dofs_topological `" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "d729bf78", │ │ │ │ │ │ + "id": "b2fde44b", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "dofs = fem.locate_dofs_topological(V=V, entity_dim=tdim - 1, entities=facets)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "61cc96d4", │ │ │ │ │ │ + "id": "86aab5b3", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "and use {py:func}`dirichletbc ` to define the\n", │ │ │ │ │ │ "essential boundary condition. On the boundary we prescribe the\n", │ │ │ │ │ │ "{py:class}`Function ` `uD`, which we create by\n", │ │ │ │ │ │ "interpolating the expression $u_{\\rm D}$ in the finite element space\n", │ │ │ │ │ │ "$V$." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "f9a976a2", │ │ │ │ │ │ + "id": "5fd38d9c", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "uD = fem.Function(V, dtype=dtype)\n", │ │ │ │ │ │ "uD.interpolate(lambda x: 1 + x[0] ** 2 + 2 * x[1] ** 2)\n", │ │ │ │ │ │ "bc = fem.dirichletbc(value=uD, dofs=dofs)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "22aa3840", │ │ │ │ │ │ + "id": "3b7feae3", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "Next, we express the variational problem using UFL." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "44d911cb", │ │ │ │ │ │ + "id": "547b0904", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "x = ufl.SpatialCoordinate(mesh)\n", │ │ │ │ │ │ "u = ufl.TrialFunction(V)\n", │ │ │ │ │ │ "v = ufl.TestFunction(V)\n", │ │ │ │ │ │ "f = fem.Constant(mesh, dtype(-6.0))\n", │ │ │ │ │ │ "a = inner(grad(u), grad(v)) * dx\n", │ │ │ │ │ │ "L = inner(f, v) * dx\n", │ │ │ │ │ │ "L_fem = fem.form(L, dtype=dtype)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "6d5201fd", │ │ │ │ │ │ + "id": "c12d4f6b", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "For the matrix-free solvers we also define a second linear form `M` as\n", │ │ │ │ │ │ "the {py:class}`action ` of the bilinear form $a$ on an\n", │ │ │ │ │ │ "arbitrary {py:class}`Function ` `ui`. This linear\n", │ │ │ │ │ │ "form is defined as\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ @@ -251,78 +251,78 @@ │ │ │ │ │ │ "M(v) = a(u_i, v) \\quad \\text{for} \\; \\ u_i \\in V.\n", │ │ │ │ │ │ "$$" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "ef60e551", │ │ │ │ │ │ + "id": "e62f96d8", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "ui = fem.Function(V, dtype=dtype)\n", │ │ │ │ │ │ "M = action(a, ui)\n", │ │ │ │ │ │ "M_fem = fem.form(M, dtype=dtype)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "1e6852b3", │ │ │ │ │ │ + "id": "f36436e1", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "### Matrix-free conjugate gradient solver\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "The right hand side vector $b - A x_{\\rm bc}$ is the assembly of the linear\n", │ │ │ │ │ │ "form $L$ where the essential Dirichlet boundary conditions are implemented\n", │ │ │ │ │ │ "using lifting. Since we want to avoid assembling the matrix `A`, we compute\n", │ │ │ │ │ │ "the necessary matrix-vector product using the linear form `M` explicitly." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "4334a495", │ │ │ │ │ │ + "id": "bcf4d24a", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Apply lifting: b <- b - A * x_bc\n", │ │ │ │ │ │ "b = fem.assemble_vector(L_fem)\n", │ │ │ │ │ │ "ui.x.array[:] = 0.0\n", │ │ │ │ │ │ "bc.set(ui.x.array, alpha=-1.0)\n", │ │ │ │ │ │ "fem.assemble_vector(b.array, M_fem)\n", │ │ │ │ │ │ "b.scatter_reverse(la.InsertMode.add)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "8e67eb09", │ │ │ │ │ │ + "id": "8f9f4f95", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Set BC dofs to zero on right hand side\n", │ │ │ │ │ │ "bc.set(b.array, alpha=0.0)\n", │ │ │ │ │ │ "b.scatter_forward()" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "5efd0b7c", │ │ │ │ │ │ + "id": "46112776", │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "lines_to_next_cell": 2 │ │ │ │ │ │ }, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "To implement the matrix-free CG solver using *DOLFINx* vectors, we define the\n", │ │ │ │ │ │ "function `action_A` to compute the matrix-vector product $y = A x$." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "b6518ca5", │ │ │ │ │ │ + "id": "d3667e6f", │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "lines_to_next_cell": 2 │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "def action_A(x, y):\n", │ │ │ │ │ │ " # Set coefficient vector of the linear form M and ensure it is updated\n", │ │ │ │ │ │ @@ -337,15 +337,15 @@ │ │ │ │ │ │ "\n", │ │ │ │ │ │ " # Set BC dofs to zero\n", │ │ │ │ │ │ " bc.set(y.array, alpha=0.0)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "d349c36d", │ │ │ │ │ │ + "id": "26ac7ad2", │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "lines_to_next_cell": 2 │ │ │ │ │ │ }, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "### Basic conjugate gradient solver\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "Solves the problem `A x = b`, using the function `action_A` as the operator,\n", │ │ │ │ │ │ @@ -353,15 +353,15 @@ │ │ │ │ │ │ "vector. `comm` is the MPI Communicator, `max_iter` is the maximum number of\n", │ │ │ │ │ │ "iterations, `rtol` is the relative tolerance." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "ba0ef83c", │ │ │ │ │ │ + "id": "12aa669d", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "def cg(comm, action_A, x: la.Vector, b: la.Vector, max_iter: int = 200, rtol: float = 1e-6):\n", │ │ │ │ │ │ " rtol2 = rtol**2\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ " nr = b.index_map.size_local\n", │ │ │ │ │ │ @@ -399,61 +399,61 @@ │ │ │ │ │ │ " p.array[:] = beta * p.array + r\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ " raise RuntimeError(f\"Solver exceeded max iterations ({max_iter}).\")" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "f78e52cd", │ │ │ │ │ │ + "id": "42a902b1", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "This matrix-free solver is now used to compute the finite element solution.\n", │ │ │ │ │ │ "The finite element solution's approximation error as compared with the\n", │ │ │ │ │ │ "exact solution is measured in the $L_2$-norm." │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "b68a18fe", │ │ │ │ │ │ + "id": "6bf5066a", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "rtol = 1e-6\n", │ │ │ │ │ │ "u = fem.Function(V, dtype=dtype)\n", │ │ │ │ │ │ "iter_cg1 = cg(mesh.comm, action_A, u.x, b, max_iter=200, rtol=rtol)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "a6193c86", │ │ │ │ │ │ + "id": "890e07a5", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Set BC values in the solution vector\n", │ │ │ │ │ │ "bc.set(u.x.array, alpha=1.0)" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "ad7cc121", │ │ │ │ │ │ + "id": "b65f6908", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "def L2Norm(u):\n", │ │ │ │ │ │ " val = fem.assemble_scalar(fem.form(inner(u, u) * dx, dtype=dtype))\n", │ │ │ │ │ │ " return np.sqrt(comm.allreduce(val, op=MPI.SUM))" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "7da0f4ae", │ │ │ │ │ │ + "id": "6024decf", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Print CG iteration number and error\n", │ │ │ │ │ │ "error_L2_cg1 = L2Norm(u - uD)\n", │ │ │ │ │ │ "if mesh.comm.rank == 0:\n", │ │ │ │ │ │ " print(\"Matrix-free CG solver using DOLFINx vectors:\")\n", │ │ │ ├── ./usr/share/doc/dolfinx-doc/python/_downloads/9ed4657d08dda04de30e6463e2f58d75/demo_mixed-poisson.ipynb.gz │ │ │ │ ├── demo_mixed-poisson.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9856770833333333% │ │ │ │ │ │┄ Differences: {"'cells'": "{0: {'id': 'e50b217a'}, 1: {'id': 'abc4a017'}, 2: {'id': '4a505c8b'}, 3: {'id': " │ │ │ │ │ │┄ "'45e7a3b5'}}"} │ │ │ │ │ │ @@ -1,32 +1,32 @@ │ │ │ │ │ │ { │ │ │ │ │ │ "cells": [ │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "47714c19", │ │ │ │ │ │ + "id": "e50b217a", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Mixed formulation for the Poisson equation" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "955b52f1", │ │ │ │ │ │ + "id": "abc4a017", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "This demo illustrates how to solve Poisson equation using a mixed\n", │ │ │ │ │ │ "(two-field) formulation. In particular, it illustrates how to\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "* Use mixed and non-continuous finite element spaces.\n", │ │ │ │ │ │ "* Set essential boundary conditions for subspaces and $H(\\mathrm{div})$ spaces.\n" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "markdown", │ │ │ │ │ │ - "id": "03431362", │ │ │ │ │ │ + "id": "4a505c8b", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "```{admonition} Download sources\n", │ │ │ │ │ │ ":class: download\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "* {download}`Python script <./demo_mixed-poisson.py>`\n", │ │ │ │ │ │ "* {download}`Jupyter notebook <./demo_mixed-poisson.ipynb>`\n", │ │ │ │ │ │ @@ -99,15 +99,15 @@ │ │ │ │ │ │ "\n", │ │ │ │ │ │ "## Implementation" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": null, │ │ │ │ │ │ - "id": "c2f24914", │ │ │ │ │ │ + "id": "45e7a3b5", │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "\n", │ │ │ │ │ │ "try:\n", │ │ │ │ │ │ " from petsc4py import PETSc\n", │ │ │ │ │ │ "\n",