From: Katharina Kormann Date: Mon, 9 Apr 2018 19:47:36 +0000 (+0200) Subject: Face initialization for matrix-free DG. X-Git-Tag: v9.0.0-rc1~148^2~2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eabe5776365a84d269d513614320fc6cbc933ad7;p=dealii.git Face initialization for matrix-free DG. --- diff --git a/include/deal.II/matrix_free/face_info.h b/include/deal.II/matrix_free/face_info.h new file mode 100644 index 0000000000..5f464fa885 --- /dev/null +++ b/include/deal.II/matrix_free/face_info.h @@ -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 +#include +#include + + +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 + 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 + struct FaceInfo + { + /** + * Clear all data fields to be in a state similar to after having + * called the default constructor. + */ + void clear() + { + faces = std::vector >(); + 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 > 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