]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix bug in get_face_iterator 8944/head
authorPeter Munch <peterrmuench@gmail.com>
Tue, 22 Oct 2019 10:04:18 +0000 (12:04 +0200)
committerPeter Munch <peterrmuench@gmail.com>
Fri, 25 Oct 2019 23:09:38 +0000 (01:09 +0200)
include/deal.II/matrix_free/matrix_free.templates.h
tests/matrix_free/iterators.cc [new file with mode: 0644]
tests/matrix_free/iterators.output [new file with mode: 0644]

index 4c552eb505accfce7a212630690990305cc6d09a..28848a2aac2540d970f1aeaa49d2427745eea6a4 100644 (file)
@@ -218,7 +218,8 @@ MatrixFree<dim, Number, VectorizedArrayType>::get_face_iterator(
   AssertIndexRange(fe_component, dof_handlers.n_dof_handlers);
   if (interior)
     {
-      AssertIndexRange(face_batch_number, n_ghost_inner_face_batches());
+      AssertIndexRange(face_batch_number,
+                       n_inner_face_batches() + n_boundary_face_batches());
     }
   else
     {
diff --git a/tests/matrix_free/iterators.cc b/tests/matrix_free/iterators.cc
new file mode 100644 (file)
index 0000000..116d124
--- /dev/null
@@ -0,0 +1,194 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2019 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE.md at
+// the top level directory of deal.II.
+//
+// ---------------------------------------------------------------------
+
+
+
+// tests matrix-free get_cell_iterator and get_face_iterator for
+// a globally refined mesh
+
+
+#include <deal.II/base/mpi.h>
+#include <deal.II/base/quadrature_lib.h>
+
+#include <deal.II/dofs/dof_handler.h>
+
+#include <deal.II/fe/fe_dgq.h>
+#include <deal.II/fe/mapping_q.h>
+
+#include <deal.II/grid/grid_generator.h>
+
+#include <deal.II/matrix_free/matrix_free.h>
+
+#include <deal.II/multigrid/mg_constrained_dofs.h>
+
+#include <set>
+
+#include "../tests.h"
+
+using namespace dealii;
+
+template <int dim,
+          typename Number              = double,
+          typename VectorizedArrayType = VectorizedArray<Number>>
+class Test
+{
+public:
+  using VectorType = LinearAlgebra::distributed::Vector<Number>;
+
+  void
+  run(unsigned int fe_degree)
+  {
+    Triangulation<dim> tria(
+      Triangulation<dim>::limit_level_difference_at_vertices);
+    GridGenerator::hyper_cube(tria);
+
+    tria.refine_global(2);
+
+    FE_DGQ<dim>     fe(fe_degree);
+    DoFHandler<dim> dof_handler(tria);
+    dof_handler.distribute_dofs(fe);
+    dof_handler.distribute_mg_dofs();
+
+    MappingQ<dim> mapping(1);
+
+    QGauss<1> quad(fe_degree + 1);
+
+
+
+    for (unsigned int level = numbers::invalid_unsigned_int;
+         level < tria.n_global_levels() ||
+         level == numbers::invalid_unsigned_int;
+         level++)
+      {
+        if (level == numbers::invalid_unsigned_int)
+          deallog << "Active level (with max_level="
+                  << tria.n_global_levels() - 1 << "):" << std::endl;
+        else
+          deallog << "Multigrid level " << level << ":" << std::endl;
+
+        AffineConstraints<Number> constraint;
+
+        typename MatrixFree<dim, Number, VectorizedArrayType>::AdditionalData
+          additional_data;
+        additional_data.mapping_update_flags                = update_values;
+        additional_data.mapping_update_flags_inner_faces    = update_values;
+        additional_data.mapping_update_flags_boundary_faces = update_values;
+        additional_data.mg_level                            = level;
+
+        MatrixFree<dim, Number, VectorizedArrayType> matrix_free;
+        matrix_free.reinit(
+          mapping, dof_handler, constraint, quad, additional_data);
+
+        VectorType src, dst;
+
+        matrix_free.initialize_dof_vector(src);
+        matrix_free.initialize_dof_vector(dst);
+
+        matrix_free.loop(&Test::cell_operation,
+                         &Test::face_operation,
+                         &Test::boundary_operation,
+                         this,
+                         dst,
+                         src);
+
+        for (const auto cell : cells)
+          deallog << "cell:      " << cell.to_string() << std::endl;
+
+        for (const auto face : faces)
+          deallog << "face:      " << face.first.to_string() << " "
+                  << face.second.to_string() << std::endl;
+
+        for (const auto boundary : boundaries)
+          deallog << "boundary:  " << boundary.to_string() << std::endl;
+
+        cells.clear();
+        faces.clear();
+        boundaries.clear();
+
+        deallog << std::endl;
+      }
+  }
+
+private:
+  void
+  cell_operation(const MatrixFree<dim, Number, VectorizedArrayType> &data,
+                 VectorType &,
+                 const VectorType &,
+                 const std::pair<unsigned int, unsigned int> &pair) const
+  {
+    for (auto cell = pair.first; cell < pair.second; cell++)
+      for (auto lane = 0u; lane < data.n_active_entries_per_cell_batch(cell);
+           lane++)
+        cells.emplace(data.get_cell_iterator(cell, lane)->id());
+  }
+
+  void
+  face_operation(const MatrixFree<dim, Number, VectorizedArrayType> &data,
+                 VectorType &,
+                 const VectorType &,
+                 const std::pair<unsigned int, unsigned int> &pair) const
+  {
+    for (auto face = pair.first; face < pair.second; face++)
+      for (auto lane = 0u; lane < data.n_active_entries_per_face_batch(face);
+           lane++)
+        {
+          const auto face_0 =
+            data.get_face_iterator(face, lane, true).first->id();
+          const auto face_1 =
+            data.get_face_iterator(face, lane, false).first->id();
+          if (face_0 < face_1)
+            faces.emplace(face_0, face_1);
+          else
+            faces.emplace(face_1, face_0);
+        }
+  }
+
+
+  void
+  boundary_operation(const MatrixFree<dim, Number, VectorizedArrayType> &data,
+                     VectorType &,
+                     const VectorType &,
+                     const std::pair<unsigned int, unsigned int> &pair) const
+  {
+    for (auto face = pair.first; face < pair.second; face++)
+      for (auto lane = 0u; lane < data.n_active_entries_per_face_batch(face);
+           lane++)
+        boundaries.emplace(
+          data.get_face_iterator(face, lane, true).first->id());
+  }
+
+  mutable std::set<CellId>                    cells;
+  mutable std::set<std::pair<CellId, CellId>> faces;
+  mutable std::set<CellId>                    boundaries;
+};
+
+
+int
+main()
+{
+  initlog();
+  {
+    deallog.push("2d");
+    Test<2> runner;
+    runner.run(1);
+    deallog.pop();
+  }
+  {
+    deallog.push("3d");
+    Test<3> runner;
+    runner.run(1);
+    deallog.pop();
+  }
+}
diff --git a/tests/matrix_free/iterators.output b/tests/matrix_free/iterators.output
new file mode 100644 (file)
index 0000000..c3d3128
--- /dev/null
@@ -0,0 +1,693 @@
+
+DEAL:2d::Active level (with max_level=2):
+DEAL:2d::cell:      0_2:00
+DEAL:2d::cell:      0_2:01
+DEAL:2d::cell:      0_2:02
+DEAL:2d::cell:      0_2:03
+DEAL:2d::cell:      0_2:10
+DEAL:2d::cell:      0_2:11
+DEAL:2d::cell:      0_2:12
+DEAL:2d::cell:      0_2:13
+DEAL:2d::cell:      0_2:20
+DEAL:2d::cell:      0_2:21
+DEAL:2d::cell:      0_2:22
+DEAL:2d::cell:      0_2:23
+DEAL:2d::cell:      0_2:30
+DEAL:2d::cell:      0_2:31
+DEAL:2d::cell:      0_2:32
+DEAL:2d::cell:      0_2:33
+DEAL:2d::face:      0_2:00 0_2:01
+DEAL:2d::face:      0_2:00 0_2:02
+DEAL:2d::face:      0_2:01 0_2:03
+DEAL:2d::face:      0_2:01 0_2:10
+DEAL:2d::face:      0_2:02 0_2:03
+DEAL:2d::face:      0_2:02 0_2:20
+DEAL:2d::face:      0_2:03 0_2:12
+DEAL:2d::face:      0_2:03 0_2:21
+DEAL:2d::face:      0_2:10 0_2:11
+DEAL:2d::face:      0_2:10 0_2:12
+DEAL:2d::face:      0_2:11 0_2:13
+DEAL:2d::face:      0_2:12 0_2:13
+DEAL:2d::face:      0_2:12 0_2:30
+DEAL:2d::face:      0_2:13 0_2:31
+DEAL:2d::face:      0_2:20 0_2:21
+DEAL:2d::face:      0_2:20 0_2:22
+DEAL:2d::face:      0_2:21 0_2:23
+DEAL:2d::face:      0_2:21 0_2:30
+DEAL:2d::face:      0_2:22 0_2:23
+DEAL:2d::face:      0_2:23 0_2:32
+DEAL:2d::face:      0_2:30 0_2:31
+DEAL:2d::face:      0_2:30 0_2:32
+DEAL:2d::face:      0_2:31 0_2:33
+DEAL:2d::face:      0_2:32 0_2:33
+DEAL:2d::boundary:  0_2:00
+DEAL:2d::boundary:  0_2:01
+DEAL:2d::boundary:  0_2:02
+DEAL:2d::boundary:  0_2:10
+DEAL:2d::boundary:  0_2:11
+DEAL:2d::boundary:  0_2:13
+DEAL:2d::boundary:  0_2:20
+DEAL:2d::boundary:  0_2:22
+DEAL:2d::boundary:  0_2:23
+DEAL:2d::boundary:  0_2:31
+DEAL:2d::boundary:  0_2:32
+DEAL:2d::boundary:  0_2:33
+DEAL:2d::
+DEAL:2d::Multigrid level 0:
+DEAL:2d::cell:      0_0:
+DEAL:2d::boundary:  0_0:
+DEAL:2d::
+DEAL:2d::Multigrid level 1:
+DEAL:2d::cell:      0_1:0
+DEAL:2d::cell:      0_1:1
+DEAL:2d::cell:      0_1:2
+DEAL:2d::cell:      0_1:3
+DEAL:2d::face:      0_1:0 0_1:1
+DEAL:2d::face:      0_1:0 0_1:2
+DEAL:2d::face:      0_1:1 0_1:3
+DEAL:2d::face:      0_1:2 0_1:3
+DEAL:2d::boundary:  0_1:0
+DEAL:2d::boundary:  0_1:1
+DEAL:2d::boundary:  0_1:2
+DEAL:2d::boundary:  0_1:3
+DEAL:2d::
+DEAL:2d::Multigrid level 2:
+DEAL:2d::cell:      0_2:00
+DEAL:2d::cell:      0_2:01
+DEAL:2d::cell:      0_2:02
+DEAL:2d::cell:      0_2:03
+DEAL:2d::cell:      0_2:10
+DEAL:2d::cell:      0_2:11
+DEAL:2d::cell:      0_2:12
+DEAL:2d::cell:      0_2:13
+DEAL:2d::cell:      0_2:20
+DEAL:2d::cell:      0_2:21
+DEAL:2d::cell:      0_2:22
+DEAL:2d::cell:      0_2:23
+DEAL:2d::cell:      0_2:30
+DEAL:2d::cell:      0_2:31
+DEAL:2d::cell:      0_2:32
+DEAL:2d::cell:      0_2:33
+DEAL:2d::face:      0_2:00 0_2:01
+DEAL:2d::face:      0_2:00 0_2:02
+DEAL:2d::face:      0_2:01 0_2:03
+DEAL:2d::face:      0_2:01 0_2:10
+DEAL:2d::face:      0_2:02 0_2:03
+DEAL:2d::face:      0_2:02 0_2:20
+DEAL:2d::face:      0_2:03 0_2:12
+DEAL:2d::face:      0_2:03 0_2:21
+DEAL:2d::face:      0_2:10 0_2:11
+DEAL:2d::face:      0_2:10 0_2:12
+DEAL:2d::face:      0_2:11 0_2:13
+DEAL:2d::face:      0_2:12 0_2:13
+DEAL:2d::face:      0_2:12 0_2:30
+DEAL:2d::face:      0_2:13 0_2:31
+DEAL:2d::face:      0_2:20 0_2:21
+DEAL:2d::face:      0_2:20 0_2:22
+DEAL:2d::face:      0_2:21 0_2:23
+DEAL:2d::face:      0_2:21 0_2:30
+DEAL:2d::face:      0_2:22 0_2:23
+DEAL:2d::face:      0_2:23 0_2:32
+DEAL:2d::face:      0_2:30 0_2:31
+DEAL:2d::face:      0_2:30 0_2:32
+DEAL:2d::face:      0_2:31 0_2:33
+DEAL:2d::face:      0_2:32 0_2:33
+DEAL:2d::boundary:  0_2:00
+DEAL:2d::boundary:  0_2:01
+DEAL:2d::boundary:  0_2:02
+DEAL:2d::boundary:  0_2:10
+DEAL:2d::boundary:  0_2:11
+DEAL:2d::boundary:  0_2:13
+DEAL:2d::boundary:  0_2:20
+DEAL:2d::boundary:  0_2:22
+DEAL:2d::boundary:  0_2:23
+DEAL:2d::boundary:  0_2:31
+DEAL:2d::boundary:  0_2:32
+DEAL:2d::boundary:  0_2:33
+DEAL:2d::
+DEAL:3d::Active level (with max_level=2):
+DEAL:3d::cell:      0_2:00
+DEAL:3d::cell:      0_2:01
+DEAL:3d::cell:      0_2:02
+DEAL:3d::cell:      0_2:03
+DEAL:3d::cell:      0_2:04
+DEAL:3d::cell:      0_2:05
+DEAL:3d::cell:      0_2:06
+DEAL:3d::cell:      0_2:07
+DEAL:3d::cell:      0_2:10
+DEAL:3d::cell:      0_2:11
+DEAL:3d::cell:      0_2:12
+DEAL:3d::cell:      0_2:13
+DEAL:3d::cell:      0_2:14
+DEAL:3d::cell:      0_2:15
+DEAL:3d::cell:      0_2:16
+DEAL:3d::cell:      0_2:17
+DEAL:3d::cell:      0_2:20
+DEAL:3d::cell:      0_2:21
+DEAL:3d::cell:      0_2:22
+DEAL:3d::cell:      0_2:23
+DEAL:3d::cell:      0_2:24
+DEAL:3d::cell:      0_2:25
+DEAL:3d::cell:      0_2:26
+DEAL:3d::cell:      0_2:27
+DEAL:3d::cell:      0_2:30
+DEAL:3d::cell:      0_2:31
+DEAL:3d::cell:      0_2:32
+DEAL:3d::cell:      0_2:33
+DEAL:3d::cell:      0_2:34
+DEAL:3d::cell:      0_2:35
+DEAL:3d::cell:      0_2:36
+DEAL:3d::cell:      0_2:37
+DEAL:3d::cell:      0_2:40
+DEAL:3d::cell:      0_2:41
+DEAL:3d::cell:      0_2:42
+DEAL:3d::cell:      0_2:43
+DEAL:3d::cell:      0_2:44
+DEAL:3d::cell:      0_2:45
+DEAL:3d::cell:      0_2:46
+DEAL:3d::cell:      0_2:47
+DEAL:3d::cell:      0_2:50
+DEAL:3d::cell:      0_2:51
+DEAL:3d::cell:      0_2:52
+DEAL:3d::cell:      0_2:53
+DEAL:3d::cell:      0_2:54
+DEAL:3d::cell:      0_2:55
+DEAL:3d::cell:      0_2:56
+DEAL:3d::cell:      0_2:57
+DEAL:3d::cell:      0_2:60
+DEAL:3d::cell:      0_2:61
+DEAL:3d::cell:      0_2:62
+DEAL:3d::cell:      0_2:63
+DEAL:3d::cell:      0_2:64
+DEAL:3d::cell:      0_2:65
+DEAL:3d::cell:      0_2:66
+DEAL:3d::cell:      0_2:67
+DEAL:3d::cell:      0_2:70
+DEAL:3d::cell:      0_2:71
+DEAL:3d::cell:      0_2:72
+DEAL:3d::cell:      0_2:73
+DEAL:3d::cell:      0_2:74
+DEAL:3d::cell:      0_2:75
+DEAL:3d::cell:      0_2:76
+DEAL:3d::cell:      0_2:77
+DEAL:3d::face:      0_2:00 0_2:01
+DEAL:3d::face:      0_2:00 0_2:02
+DEAL:3d::face:      0_2:00 0_2:04
+DEAL:3d::face:      0_2:01 0_2:03
+DEAL:3d::face:      0_2:01 0_2:05
+DEAL:3d::face:      0_2:01 0_2:10
+DEAL:3d::face:      0_2:02 0_2:03
+DEAL:3d::face:      0_2:02 0_2:06
+DEAL:3d::face:      0_2:02 0_2:20
+DEAL:3d::face:      0_2:03 0_2:07
+DEAL:3d::face:      0_2:03 0_2:12
+DEAL:3d::face:      0_2:03 0_2:21
+DEAL:3d::face:      0_2:04 0_2:05
+DEAL:3d::face:      0_2:04 0_2:06
+DEAL:3d::face:      0_2:04 0_2:40
+DEAL:3d::face:      0_2:05 0_2:07
+DEAL:3d::face:      0_2:05 0_2:14
+DEAL:3d::face:      0_2:05 0_2:41
+DEAL:3d::face:      0_2:06 0_2:07
+DEAL:3d::face:      0_2:06 0_2:24
+DEAL:3d::face:      0_2:06 0_2:42
+DEAL:3d::face:      0_2:07 0_2:16
+DEAL:3d::face:      0_2:07 0_2:25
+DEAL:3d::face:      0_2:07 0_2:43
+DEAL:3d::face:      0_2:10 0_2:11
+DEAL:3d::face:      0_2:10 0_2:12
+DEAL:3d::face:      0_2:10 0_2:14
+DEAL:3d::face:      0_2:11 0_2:13
+DEAL:3d::face:      0_2:11 0_2:15
+DEAL:3d::face:      0_2:12 0_2:13
+DEAL:3d::face:      0_2:12 0_2:16
+DEAL:3d::face:      0_2:12 0_2:30
+DEAL:3d::face:      0_2:13 0_2:17
+DEAL:3d::face:      0_2:13 0_2:31
+DEAL:3d::face:      0_2:14 0_2:15
+DEAL:3d::face:      0_2:14 0_2:16
+DEAL:3d::face:      0_2:14 0_2:50
+DEAL:3d::face:      0_2:15 0_2:17
+DEAL:3d::face:      0_2:15 0_2:51
+DEAL:3d::face:      0_2:16 0_2:17
+DEAL:3d::face:      0_2:16 0_2:34
+DEAL:3d::face:      0_2:16 0_2:52
+DEAL:3d::face:      0_2:17 0_2:35
+DEAL:3d::face:      0_2:17 0_2:53
+DEAL:3d::face:      0_2:20 0_2:21
+DEAL:3d::face:      0_2:20 0_2:22
+DEAL:3d::face:      0_2:20 0_2:24
+DEAL:3d::face:      0_2:21 0_2:23
+DEAL:3d::face:      0_2:21 0_2:25
+DEAL:3d::face:      0_2:21 0_2:30
+DEAL:3d::face:      0_2:22 0_2:23
+DEAL:3d::face:      0_2:22 0_2:26
+DEAL:3d::face:      0_2:23 0_2:27
+DEAL:3d::face:      0_2:23 0_2:32
+DEAL:3d::face:      0_2:24 0_2:25
+DEAL:3d::face:      0_2:24 0_2:26
+DEAL:3d::face:      0_2:24 0_2:60
+DEAL:3d::face:      0_2:25 0_2:27
+DEAL:3d::face:      0_2:25 0_2:34
+DEAL:3d::face:      0_2:25 0_2:61
+DEAL:3d::face:      0_2:26 0_2:27
+DEAL:3d::face:      0_2:26 0_2:62
+DEAL:3d::face:      0_2:27 0_2:36
+DEAL:3d::face:      0_2:27 0_2:63
+DEAL:3d::face:      0_2:30 0_2:31
+DEAL:3d::face:      0_2:30 0_2:32
+DEAL:3d::face:      0_2:30 0_2:34
+DEAL:3d::face:      0_2:31 0_2:33
+DEAL:3d::face:      0_2:31 0_2:35
+DEAL:3d::face:      0_2:32 0_2:33
+DEAL:3d::face:      0_2:32 0_2:36
+DEAL:3d::face:      0_2:33 0_2:37
+DEAL:3d::face:      0_2:34 0_2:35
+DEAL:3d::face:      0_2:34 0_2:36
+DEAL:3d::face:      0_2:34 0_2:70
+DEAL:3d::face:      0_2:35 0_2:37
+DEAL:3d::face:      0_2:35 0_2:71
+DEAL:3d::face:      0_2:36 0_2:37
+DEAL:3d::face:      0_2:36 0_2:72
+DEAL:3d::face:      0_2:37 0_2:73
+DEAL:3d::face:      0_2:40 0_2:41
+DEAL:3d::face:      0_2:40 0_2:42
+DEAL:3d::face:      0_2:40 0_2:44
+DEAL:3d::face:      0_2:41 0_2:43
+DEAL:3d::face:      0_2:41 0_2:45
+DEAL:3d::face:      0_2:41 0_2:50
+DEAL:3d::face:      0_2:42 0_2:43
+DEAL:3d::face:      0_2:42 0_2:46
+DEAL:3d::face:      0_2:42 0_2:60
+DEAL:3d::face:      0_2:43 0_2:47
+DEAL:3d::face:      0_2:43 0_2:52
+DEAL:3d::face:      0_2:43 0_2:61
+DEAL:3d::face:      0_2:44 0_2:45
+DEAL:3d::face:      0_2:44 0_2:46
+DEAL:3d::face:      0_2:45 0_2:47
+DEAL:3d::face:      0_2:45 0_2:54
+DEAL:3d::face:      0_2:46 0_2:47
+DEAL:3d::face:      0_2:46 0_2:64
+DEAL:3d::face:      0_2:47 0_2:56
+DEAL:3d::face:      0_2:47 0_2:65
+DEAL:3d::face:      0_2:50 0_2:51
+DEAL:3d::face:      0_2:50 0_2:52
+DEAL:3d::face:      0_2:50 0_2:54
+DEAL:3d::face:      0_2:51 0_2:53
+DEAL:3d::face:      0_2:51 0_2:55
+DEAL:3d::face:      0_2:52 0_2:53
+DEAL:3d::face:      0_2:52 0_2:56
+DEAL:3d::face:      0_2:52 0_2:70
+DEAL:3d::face:      0_2:53 0_2:57
+DEAL:3d::face:      0_2:53 0_2:71
+DEAL:3d::face:      0_2:54 0_2:55
+DEAL:3d::face:      0_2:54 0_2:56
+DEAL:3d::face:      0_2:55 0_2:57
+DEAL:3d::face:      0_2:56 0_2:57
+DEAL:3d::face:      0_2:56 0_2:74
+DEAL:3d::face:      0_2:57 0_2:75
+DEAL:3d::face:      0_2:60 0_2:61
+DEAL:3d::face:      0_2:60 0_2:62
+DEAL:3d::face:      0_2:60 0_2:64
+DEAL:3d::face:      0_2:61 0_2:63
+DEAL:3d::face:      0_2:61 0_2:65
+DEAL:3d::face:      0_2:61 0_2:70
+DEAL:3d::face:      0_2:62 0_2:63
+DEAL:3d::face:      0_2:62 0_2:66
+DEAL:3d::face:      0_2:63 0_2:67
+DEAL:3d::face:      0_2:63 0_2:72
+DEAL:3d::face:      0_2:64 0_2:65
+DEAL:3d::face:      0_2:64 0_2:66
+DEAL:3d::face:      0_2:65 0_2:67
+DEAL:3d::face:      0_2:65 0_2:74
+DEAL:3d::face:      0_2:66 0_2:67
+DEAL:3d::face:      0_2:67 0_2:76
+DEAL:3d::face:      0_2:70 0_2:71
+DEAL:3d::face:      0_2:70 0_2:72
+DEAL:3d::face:      0_2:70 0_2:74
+DEAL:3d::face:      0_2:71 0_2:73
+DEAL:3d::face:      0_2:71 0_2:75
+DEAL:3d::face:      0_2:72 0_2:73
+DEAL:3d::face:      0_2:72 0_2:76
+DEAL:3d::face:      0_2:73 0_2:77
+DEAL:3d::face:      0_2:74 0_2:75
+DEAL:3d::face:      0_2:74 0_2:76
+DEAL:3d::face:      0_2:75 0_2:77
+DEAL:3d::face:      0_2:76 0_2:77
+DEAL:3d::boundary:  0_2:00
+DEAL:3d::boundary:  0_2:01
+DEAL:3d::boundary:  0_2:02
+DEAL:3d::boundary:  0_2:03
+DEAL:3d::boundary:  0_2:04
+DEAL:3d::boundary:  0_2:05
+DEAL:3d::boundary:  0_2:06
+DEAL:3d::boundary:  0_2:10
+DEAL:3d::boundary:  0_2:11
+DEAL:3d::boundary:  0_2:12
+DEAL:3d::boundary:  0_2:13
+DEAL:3d::boundary:  0_2:14
+DEAL:3d::boundary:  0_2:15
+DEAL:3d::boundary:  0_2:17
+DEAL:3d::boundary:  0_2:20
+DEAL:3d::boundary:  0_2:21
+DEAL:3d::boundary:  0_2:22
+DEAL:3d::boundary:  0_2:23
+DEAL:3d::boundary:  0_2:24
+DEAL:3d::boundary:  0_2:26
+DEAL:3d::boundary:  0_2:27
+DEAL:3d::boundary:  0_2:30
+DEAL:3d::boundary:  0_2:31
+DEAL:3d::boundary:  0_2:32
+DEAL:3d::boundary:  0_2:33
+DEAL:3d::boundary:  0_2:35
+DEAL:3d::boundary:  0_2:36
+DEAL:3d::boundary:  0_2:37
+DEAL:3d::boundary:  0_2:40
+DEAL:3d::boundary:  0_2:41
+DEAL:3d::boundary:  0_2:42
+DEAL:3d::boundary:  0_2:44
+DEAL:3d::boundary:  0_2:45
+DEAL:3d::boundary:  0_2:46
+DEAL:3d::boundary:  0_2:47
+DEAL:3d::boundary:  0_2:50
+DEAL:3d::boundary:  0_2:51
+DEAL:3d::boundary:  0_2:53
+DEAL:3d::boundary:  0_2:54
+DEAL:3d::boundary:  0_2:55
+DEAL:3d::boundary:  0_2:56
+DEAL:3d::boundary:  0_2:57
+DEAL:3d::boundary:  0_2:60
+DEAL:3d::boundary:  0_2:62
+DEAL:3d::boundary:  0_2:63
+DEAL:3d::boundary:  0_2:64
+DEAL:3d::boundary:  0_2:65
+DEAL:3d::boundary:  0_2:66
+DEAL:3d::boundary:  0_2:67
+DEAL:3d::boundary:  0_2:71
+DEAL:3d::boundary:  0_2:72
+DEAL:3d::boundary:  0_2:73
+DEAL:3d::boundary:  0_2:74
+DEAL:3d::boundary:  0_2:75
+DEAL:3d::boundary:  0_2:76
+DEAL:3d::boundary:  0_2:77
+DEAL:3d::
+DEAL:3d::Multigrid level 0:
+DEAL:3d::cell:      0_0:
+DEAL:3d::boundary:  0_0:
+DEAL:3d::
+DEAL:3d::Multigrid level 1:
+DEAL:3d::cell:      0_1:0
+DEAL:3d::cell:      0_1:1
+DEAL:3d::cell:      0_1:2
+DEAL:3d::cell:      0_1:3
+DEAL:3d::cell:      0_1:4
+DEAL:3d::cell:      0_1:5
+DEAL:3d::cell:      0_1:6
+DEAL:3d::cell:      0_1:7
+DEAL:3d::face:      0_1:0 0_1:1
+DEAL:3d::face:      0_1:0 0_1:2
+DEAL:3d::face:      0_1:0 0_1:4
+DEAL:3d::face:      0_1:1 0_1:3
+DEAL:3d::face:      0_1:1 0_1:5
+DEAL:3d::face:      0_1:2 0_1:3
+DEAL:3d::face:      0_1:2 0_1:6
+DEAL:3d::face:      0_1:3 0_1:7
+DEAL:3d::face:      0_1:4 0_1:5
+DEAL:3d::face:      0_1:4 0_1:6
+DEAL:3d::face:      0_1:5 0_1:7
+DEAL:3d::face:      0_1:6 0_1:7
+DEAL:3d::boundary:  0_1:0
+DEAL:3d::boundary:  0_1:1
+DEAL:3d::boundary:  0_1:2
+DEAL:3d::boundary:  0_1:3
+DEAL:3d::boundary:  0_1:4
+DEAL:3d::boundary:  0_1:5
+DEAL:3d::boundary:  0_1:6
+DEAL:3d::boundary:  0_1:7
+DEAL:3d::
+DEAL:3d::Multigrid level 2:
+DEAL:3d::cell:      0_2:00
+DEAL:3d::cell:      0_2:01
+DEAL:3d::cell:      0_2:02
+DEAL:3d::cell:      0_2:03
+DEAL:3d::cell:      0_2:04
+DEAL:3d::cell:      0_2:05
+DEAL:3d::cell:      0_2:06
+DEAL:3d::cell:      0_2:07
+DEAL:3d::cell:      0_2:10
+DEAL:3d::cell:      0_2:11
+DEAL:3d::cell:      0_2:12
+DEAL:3d::cell:      0_2:13
+DEAL:3d::cell:      0_2:14
+DEAL:3d::cell:      0_2:15
+DEAL:3d::cell:      0_2:16
+DEAL:3d::cell:      0_2:17
+DEAL:3d::cell:      0_2:20
+DEAL:3d::cell:      0_2:21
+DEAL:3d::cell:      0_2:22
+DEAL:3d::cell:      0_2:23
+DEAL:3d::cell:      0_2:24
+DEAL:3d::cell:      0_2:25
+DEAL:3d::cell:      0_2:26
+DEAL:3d::cell:      0_2:27
+DEAL:3d::cell:      0_2:30
+DEAL:3d::cell:      0_2:31
+DEAL:3d::cell:      0_2:32
+DEAL:3d::cell:      0_2:33
+DEAL:3d::cell:      0_2:34
+DEAL:3d::cell:      0_2:35
+DEAL:3d::cell:      0_2:36
+DEAL:3d::cell:      0_2:37
+DEAL:3d::cell:      0_2:40
+DEAL:3d::cell:      0_2:41
+DEAL:3d::cell:      0_2:42
+DEAL:3d::cell:      0_2:43
+DEAL:3d::cell:      0_2:44
+DEAL:3d::cell:      0_2:45
+DEAL:3d::cell:      0_2:46
+DEAL:3d::cell:      0_2:47
+DEAL:3d::cell:      0_2:50
+DEAL:3d::cell:      0_2:51
+DEAL:3d::cell:      0_2:52
+DEAL:3d::cell:      0_2:53
+DEAL:3d::cell:      0_2:54
+DEAL:3d::cell:      0_2:55
+DEAL:3d::cell:      0_2:56
+DEAL:3d::cell:      0_2:57
+DEAL:3d::cell:      0_2:60
+DEAL:3d::cell:      0_2:61
+DEAL:3d::cell:      0_2:62
+DEAL:3d::cell:      0_2:63
+DEAL:3d::cell:      0_2:64
+DEAL:3d::cell:      0_2:65
+DEAL:3d::cell:      0_2:66
+DEAL:3d::cell:      0_2:67
+DEAL:3d::cell:      0_2:70
+DEAL:3d::cell:      0_2:71
+DEAL:3d::cell:      0_2:72
+DEAL:3d::cell:      0_2:73
+DEAL:3d::cell:      0_2:74
+DEAL:3d::cell:      0_2:75
+DEAL:3d::cell:      0_2:76
+DEAL:3d::cell:      0_2:77
+DEAL:3d::face:      0_2:00 0_2:01
+DEAL:3d::face:      0_2:00 0_2:02
+DEAL:3d::face:      0_2:00 0_2:04
+DEAL:3d::face:      0_2:01 0_2:03
+DEAL:3d::face:      0_2:01 0_2:05
+DEAL:3d::face:      0_2:01 0_2:10
+DEAL:3d::face:      0_2:02 0_2:03
+DEAL:3d::face:      0_2:02 0_2:06
+DEAL:3d::face:      0_2:02 0_2:20
+DEAL:3d::face:      0_2:03 0_2:07
+DEAL:3d::face:      0_2:03 0_2:12
+DEAL:3d::face:      0_2:03 0_2:21
+DEAL:3d::face:      0_2:04 0_2:05
+DEAL:3d::face:      0_2:04 0_2:06
+DEAL:3d::face:      0_2:04 0_2:40
+DEAL:3d::face:      0_2:05 0_2:07
+DEAL:3d::face:      0_2:05 0_2:14
+DEAL:3d::face:      0_2:05 0_2:41
+DEAL:3d::face:      0_2:06 0_2:07
+DEAL:3d::face:      0_2:06 0_2:24
+DEAL:3d::face:      0_2:06 0_2:42
+DEAL:3d::face:      0_2:07 0_2:16
+DEAL:3d::face:      0_2:07 0_2:25
+DEAL:3d::face:      0_2:07 0_2:43
+DEAL:3d::face:      0_2:10 0_2:11
+DEAL:3d::face:      0_2:10 0_2:12
+DEAL:3d::face:      0_2:10 0_2:14
+DEAL:3d::face:      0_2:11 0_2:13
+DEAL:3d::face:      0_2:11 0_2:15
+DEAL:3d::face:      0_2:12 0_2:13
+DEAL:3d::face:      0_2:12 0_2:16
+DEAL:3d::face:      0_2:12 0_2:30
+DEAL:3d::face:      0_2:13 0_2:17
+DEAL:3d::face:      0_2:13 0_2:31
+DEAL:3d::face:      0_2:14 0_2:15
+DEAL:3d::face:      0_2:14 0_2:16
+DEAL:3d::face:      0_2:14 0_2:50
+DEAL:3d::face:      0_2:15 0_2:17
+DEAL:3d::face:      0_2:15 0_2:51
+DEAL:3d::face:      0_2:16 0_2:17
+DEAL:3d::face:      0_2:16 0_2:34
+DEAL:3d::face:      0_2:16 0_2:52
+DEAL:3d::face:      0_2:17 0_2:35
+DEAL:3d::face:      0_2:17 0_2:53
+DEAL:3d::face:      0_2:20 0_2:21
+DEAL:3d::face:      0_2:20 0_2:22
+DEAL:3d::face:      0_2:20 0_2:24
+DEAL:3d::face:      0_2:21 0_2:23
+DEAL:3d::face:      0_2:21 0_2:25
+DEAL:3d::face:      0_2:21 0_2:30
+DEAL:3d::face:      0_2:22 0_2:23
+DEAL:3d::face:      0_2:22 0_2:26
+DEAL:3d::face:      0_2:23 0_2:27
+DEAL:3d::face:      0_2:23 0_2:32
+DEAL:3d::face:      0_2:24 0_2:25
+DEAL:3d::face:      0_2:24 0_2:26
+DEAL:3d::face:      0_2:24 0_2:60
+DEAL:3d::face:      0_2:25 0_2:27
+DEAL:3d::face:      0_2:25 0_2:34
+DEAL:3d::face:      0_2:25 0_2:61
+DEAL:3d::face:      0_2:26 0_2:27
+DEAL:3d::face:      0_2:26 0_2:62
+DEAL:3d::face:      0_2:27 0_2:36
+DEAL:3d::face:      0_2:27 0_2:63
+DEAL:3d::face:      0_2:30 0_2:31
+DEAL:3d::face:      0_2:30 0_2:32
+DEAL:3d::face:      0_2:30 0_2:34
+DEAL:3d::face:      0_2:31 0_2:33
+DEAL:3d::face:      0_2:31 0_2:35
+DEAL:3d::face:      0_2:32 0_2:33
+DEAL:3d::face:      0_2:32 0_2:36
+DEAL:3d::face:      0_2:33 0_2:37
+DEAL:3d::face:      0_2:34 0_2:35
+DEAL:3d::face:      0_2:34 0_2:36
+DEAL:3d::face:      0_2:34 0_2:70
+DEAL:3d::face:      0_2:35 0_2:37
+DEAL:3d::face:      0_2:35 0_2:71
+DEAL:3d::face:      0_2:36 0_2:37
+DEAL:3d::face:      0_2:36 0_2:72
+DEAL:3d::face:      0_2:37 0_2:73
+DEAL:3d::face:      0_2:40 0_2:41
+DEAL:3d::face:      0_2:40 0_2:42
+DEAL:3d::face:      0_2:40 0_2:44
+DEAL:3d::face:      0_2:41 0_2:43
+DEAL:3d::face:      0_2:41 0_2:45
+DEAL:3d::face:      0_2:41 0_2:50
+DEAL:3d::face:      0_2:42 0_2:43
+DEAL:3d::face:      0_2:42 0_2:46
+DEAL:3d::face:      0_2:42 0_2:60
+DEAL:3d::face:      0_2:43 0_2:47
+DEAL:3d::face:      0_2:43 0_2:52
+DEAL:3d::face:      0_2:43 0_2:61
+DEAL:3d::face:      0_2:44 0_2:45
+DEAL:3d::face:      0_2:44 0_2:46
+DEAL:3d::face:      0_2:45 0_2:47
+DEAL:3d::face:      0_2:45 0_2:54
+DEAL:3d::face:      0_2:46 0_2:47
+DEAL:3d::face:      0_2:46 0_2:64
+DEAL:3d::face:      0_2:47 0_2:56
+DEAL:3d::face:      0_2:47 0_2:65
+DEAL:3d::face:      0_2:50 0_2:51
+DEAL:3d::face:      0_2:50 0_2:52
+DEAL:3d::face:      0_2:50 0_2:54
+DEAL:3d::face:      0_2:51 0_2:53
+DEAL:3d::face:      0_2:51 0_2:55
+DEAL:3d::face:      0_2:52 0_2:53
+DEAL:3d::face:      0_2:52 0_2:56
+DEAL:3d::face:      0_2:52 0_2:70
+DEAL:3d::face:      0_2:53 0_2:57
+DEAL:3d::face:      0_2:53 0_2:71
+DEAL:3d::face:      0_2:54 0_2:55
+DEAL:3d::face:      0_2:54 0_2:56
+DEAL:3d::face:      0_2:55 0_2:57
+DEAL:3d::face:      0_2:56 0_2:57
+DEAL:3d::face:      0_2:56 0_2:74
+DEAL:3d::face:      0_2:57 0_2:75
+DEAL:3d::face:      0_2:60 0_2:61
+DEAL:3d::face:      0_2:60 0_2:62
+DEAL:3d::face:      0_2:60 0_2:64
+DEAL:3d::face:      0_2:61 0_2:63
+DEAL:3d::face:      0_2:61 0_2:65
+DEAL:3d::face:      0_2:61 0_2:70
+DEAL:3d::face:      0_2:62 0_2:63
+DEAL:3d::face:      0_2:62 0_2:66
+DEAL:3d::face:      0_2:63 0_2:67
+DEAL:3d::face:      0_2:63 0_2:72
+DEAL:3d::face:      0_2:64 0_2:65
+DEAL:3d::face:      0_2:64 0_2:66
+DEAL:3d::face:      0_2:65 0_2:67
+DEAL:3d::face:      0_2:65 0_2:74
+DEAL:3d::face:      0_2:66 0_2:67
+DEAL:3d::face:      0_2:67 0_2:76
+DEAL:3d::face:      0_2:70 0_2:71
+DEAL:3d::face:      0_2:70 0_2:72
+DEAL:3d::face:      0_2:70 0_2:74
+DEAL:3d::face:      0_2:71 0_2:73
+DEAL:3d::face:      0_2:71 0_2:75
+DEAL:3d::face:      0_2:72 0_2:73
+DEAL:3d::face:      0_2:72 0_2:76
+DEAL:3d::face:      0_2:73 0_2:77
+DEAL:3d::face:      0_2:74 0_2:75
+DEAL:3d::face:      0_2:74 0_2:76
+DEAL:3d::face:      0_2:75 0_2:77
+DEAL:3d::face:      0_2:76 0_2:77
+DEAL:3d::boundary:  0_2:00
+DEAL:3d::boundary:  0_2:01
+DEAL:3d::boundary:  0_2:02
+DEAL:3d::boundary:  0_2:03
+DEAL:3d::boundary:  0_2:04
+DEAL:3d::boundary:  0_2:05
+DEAL:3d::boundary:  0_2:06
+DEAL:3d::boundary:  0_2:10
+DEAL:3d::boundary:  0_2:11
+DEAL:3d::boundary:  0_2:12
+DEAL:3d::boundary:  0_2:13
+DEAL:3d::boundary:  0_2:14
+DEAL:3d::boundary:  0_2:15
+DEAL:3d::boundary:  0_2:17
+DEAL:3d::boundary:  0_2:20
+DEAL:3d::boundary:  0_2:21
+DEAL:3d::boundary:  0_2:22
+DEAL:3d::boundary:  0_2:23
+DEAL:3d::boundary:  0_2:24
+DEAL:3d::boundary:  0_2:26
+DEAL:3d::boundary:  0_2:27
+DEAL:3d::boundary:  0_2:30
+DEAL:3d::boundary:  0_2:31
+DEAL:3d::boundary:  0_2:32
+DEAL:3d::boundary:  0_2:33
+DEAL:3d::boundary:  0_2:35
+DEAL:3d::boundary:  0_2:36
+DEAL:3d::boundary:  0_2:37
+DEAL:3d::boundary:  0_2:40
+DEAL:3d::boundary:  0_2:41
+DEAL:3d::boundary:  0_2:42
+DEAL:3d::boundary:  0_2:44
+DEAL:3d::boundary:  0_2:45
+DEAL:3d::boundary:  0_2:46
+DEAL:3d::boundary:  0_2:47
+DEAL:3d::boundary:  0_2:50
+DEAL:3d::boundary:  0_2:51
+DEAL:3d::boundary:  0_2:53
+DEAL:3d::boundary:  0_2:54
+DEAL:3d::boundary:  0_2:55
+DEAL:3d::boundary:  0_2:56
+DEAL:3d::boundary:  0_2:57
+DEAL:3d::boundary:  0_2:60
+DEAL:3d::boundary:  0_2:62
+DEAL:3d::boundary:  0_2:63
+DEAL:3d::boundary:  0_2:64
+DEAL:3d::boundary:  0_2:65
+DEAL:3d::boundary:  0_2:66
+DEAL:3d::boundary:  0_2:67
+DEAL:3d::boundary:  0_2:71
+DEAL:3d::boundary:  0_2:72
+DEAL:3d::boundary:  0_2:73
+DEAL:3d::boundary:  0_2:74
+DEAL:3d::boundary:  0_2:75
+DEAL:3d::boundary:  0_2:76
+DEAL:3d::boundary:  0_2:77
+DEAL:3d::

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.