]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Face initialization for matrix-free DG.
authorKatharina Kormann <katharina.kormann@tum.de>
Mon, 9 Apr 2018 19:47:36 +0000 (21:47 +0200)
committerKatharina Kormann <katharina.kormann@tum.de>
Fri, 20 Apr 2018 20:09:38 +0000 (22:09 +0200)
include/deal.II/matrix_free/face_info.h [new file with mode: 0644]

diff --git a/include/deal.II/matrix_free/face_info.h b/include/deal.II/matrix_free/face_info.h
new file mode 100644 (file)
index 0000000..5f464fa
--- /dev/null
@@ -0,0 +1,170 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2018 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 at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+
+#ifndef dealii_matrix_free_face_info_h
+#define dealii_matrix_free_face_info_h
+
+
+#include <deal.II/base/exceptions.h>
+#include <deal.II/base/memory_consumption.h>
+#include <deal.II/base/table.h>
+
+
+DEAL_II_NAMESPACE_OPEN
+
+
+
+namespace internal
+{
+  namespace MatrixFreeFunctions
+  {
+    /**
+     * Data type for information about the batches build for vectorization of
+     * the face integrals. The setup of the batches for the faces is
+     * independent of the cells, and thus, we must store the relation to the
+     * cell indexing for accessing the degrees of freedom.
+     *
+     * Interior faces are stored by the two adjacent cells, which we label as
+     * "interior" and "exterior" side of the face. Normal vectors stored in
+     * MappingInfo are only stored once and are the outer normals to the cells
+     * on the "interior" side, whereas the sign is the opposite for the
+     * "exterior" side.
+     *
+     * This data field is stored as a vector for all faces involved in the
+     * computation. In order to avoid gaps in the memory representation, the
+     * four 'char' variables are put next to each other which occupies the
+     * same size as the unsigned integers on most architectures.
+     *
+     * @author Katharina Kormann, Martin Kronbichler, 2018
+     **/
+    template <int vectorization_width>
+    struct FaceToCellTopology
+    {
+      /**
+       * Indices of the faces in the current face batch as compared to the
+       * numbers of the cells on the logical "interior" side of the face which
+       * is aligned to the direction of FEEvaluation::get_normal_vector().
+       */
+      unsigned int cells_interior[vectorization_width];
+
+      /**
+       * Indices of the faces in the current face batch as compared to the
+       * numbers of the cells on the logical "exterior" side of the face which
+       * is aligned to the opposite direction of
+       * FEEvaluation::get_normal_vector(). Note that the distinction into
+       * interior and exterior faces is purely logical and refers to the
+       * direction of the normal only. In the actual discretization of a
+       * problem, the discretization typically needs to make sure that interior
+       * and exterior sides are treated properly, such as with upwind fluxes.
+       *
+       * For boundary faces, the numbers are set to
+       * `numbers::invalid_unsigned_int`.
+       */
+      unsigned int cells_exterior[vectorization_width];
+
+      /**
+       * Index of the face between 0 and GeometryInfo::faces_per_cell within
+       * the cells on the "interior" side of the faces.
+       */
+      unsigned char interior_face_no;
+
+      /**
+       * Index of the face between 0 and GeometryInfo::faces_per_cell within
+       * the cells on the "exterior" side of the faces.
+       *
+       * For a boundary face, this data field stores the boundary id.
+       */
+      unsigned char exterior_face_no;
+
+      /**
+       * For adaptively refined meshes, the cell on the exterior side of the
+       * face might be less refined than the interior side. This index
+       * indicates the possible subface index on the exterior side.
+       */
+      unsigned char subface_index;
+
+      /**
+       * In 3D, one of the two cells adjacent to a face might use a different
+       * orientation (also called as face orientation, face flip and face
+       * rotation) than the standard orientation. This variable stores the
+       * value (for one of the interior or exterior side) for the present batch
+       * of faces.
+       */
+      unsigned char face_orientation;
+
+      /**
+       * Return the memory consumption of the present data structure.
+       */
+      std::size_t memory_consumption() const
+      {
+        return sizeof (*this);
+      }
+    };
+
+
+
+    /**
+     * A data structure that holds the connectivity between the faces and the
+     * cells.
+     */
+    template <int vectorization_width>
+    struct FaceInfo
+    {
+      /**
+       * Clear all data fields to be in a state similar to after having
+       * called the default constructor.
+       */
+      void clear()
+      {
+        faces = std::vector<FaceToCellTopology<vectorization_width> >();
+        cell_and_face_to_plain_faces.reinit(TableIndices<3>(0,0,0));
+        cell_and_face_boundary_id.reinit(TableIndices<3>(0,0,0));
+      }
+
+      /**
+       * Return the memory consumption of the present data structure.
+       */
+      std::size_t memory_consumption() const
+      {
+        return sizeof (faces) + cell_and_face_to_plain_faces.memory_consumption()
+               + cell_and_face_boundary_id.memory_consumption();
+      }
+
+      /**
+       * Vectorized storage of interior faces, linking to the two cells in the
+       * vectorized cell storage.
+       */
+      std::vector<FaceToCellTopology<vectorization_width> > faces;
+
+      /**
+       * This table translates a triple of the macro cell number, the index of a
+       * face within a cell and the index within the cell batch of vectorization
+       * into the index within the @p faces array.
+       */
+      ::dealii::Table<3,unsigned int> cell_and_face_to_plain_faces;
+
+      /**
+       * Stores the boundary ids of the faces in vectorized format using the
+       * same indexing as the cell_and_face_to_plain_faces data structure
+       */
+      ::dealii::Table<3,types::boundary_id> cell_and_face_boundary_id;
+    };
+  } // end of namespace MatrixFreeFunctions
+} // end of namespace internal
+
+DEAL_II_NAMESPACE_CLOSE
+
+#endif

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.