]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Added 2d and 3d tes mesh with nonstandard faces to test orientation 11644/head
authorKonrad Simon <konrad.simon@uni-hamburg.de>
Thu, 28 Jan 2021 13:01:57 +0000 (14:01 +0100)
committerKonrad Simon <konrad.simon@uni-hamburg.de>
Thu, 4 Feb 2021 06:07:44 +0000 (07:07 +0100)
issue for vector elements. Also added conformity tests for FEs.

23 files changed:
doc/news/changes/incompatibilities/20210128Simon [new file with mode: 0644]
include/deal.II/grid/grid_generator.h
source/grid/grid_generator.cc
tests/fe/fe_conformity_dim_2_fe_abf.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_abf.output [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_bdm.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_bdm.output [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_nedelec.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_nedelec.output [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_nedelec_sz.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_nedelec_sz.output [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_q.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_q.output [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_rt.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_rt.output [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_rt_nodal.cc [new file with mode: 0644]
tests/fe/fe_conformity_dim_2_fe_rt_nodal.output [new file with mode: 0644]
tests/fe/fe_conformity_fill_vector_random.h [new file with mode: 0644]
tests/fe/fe_conformity_test.h [new file with mode: 0644]
tests/grid/grid_generator_non_standard_orientation_mesh_2d.cc [new file with mode: 0644]
tests/grid/grid_generator_non_standard_orientation_mesh_2d.output [new file with mode: 0644]
tests/grid/grid_generator_non_standard_orientation_mesh_3d.cc [new file with mode: 0644]
tests/grid/grid_generator_non_standard_orientation_mesh_3d.output [new file with mode: 0644]

diff --git a/doc/news/changes/incompatibilities/20210128Simon b/doc/news/changes/incompatibilities/20210128Simon
new file mode 100644 (file)
index 0000000..dd64ebc
--- /dev/null
@@ -0,0 +1,5 @@
+Added a simple mesh for debugging purposes that consists
+of two cubes where one of them can be chosen to have one face
+either flipped or rotated.
+<br>
+(Konrad Simon, 2021/01/28)
index d17c7e5d02366cdf055361b58e6efc264875638c..1ba64fd9b9b942b435a13c61c87a4373aa02b2ab 100644 (file)
@@ -768,6 +768,58 @@ namespace GridGenerator
                       const Point<dim> &  center = Point<dim>(),
                       const double        radius = 1.);
 
+  /**
+   * Generate a 2D mesh consisting of the unit square joined with a copy shifted
+   * by $s = (1,0)$. Depending on the flags passed either the right or the left
+   * square is rotated by $\pi/2$. This way one can generate a mesh in which one
+   * square possibly contains an edge that has the opposite tangential (and
+   * hence also opposite normal) orientation of the neighboring edge of the
+   * other square.
+   *
+   * This mesh is not overly useful from a practical point of view. For
+   * debugging purposes it can be used to check for orientation issues for
+   * vector- or tensor-valued finite elements.
+   *
+   * @note If <code>rotate_left_square==rotate_right_square</code> the mesh is consistently oriented.
+   *
+   * @param[out] tria The input triangulation.
+   * @param[in] rotate_left_square <code>true</code> if the left square is
+   * rotated by $\pi/2$.
+   * @param[in] rotate_right_square <code>true</code> if the right square is
+   * rotated by $\pi/2$.
+   */
+  void non_standard_orientation_mesh(Triangulation<2> &tria,
+                                     const bool        rotate_left_square,
+                                     const bool        rotate_right_square);
+
+  /**
+   * Generate a 3D mesh consisting of the unit cube joined with a copy shifted
+   * by $s = (1,0,0)$. Depending on the flags passed either the right or the
+   * left cube (when looking at the positively oriented (x,z)-plane) contains a
+   * face that is either not in standard orientation and/or is rotated by either
+   * $\pi/2$, $\pi$ or $3/2\pi$.
+   *
+   * This mesh is not overly useful from a practical point of view. For
+   * debugging purposes it can be used to check for orientation issues for
+   * vector- or tensor-valued finite elements.
+   *
+   * @param[out] tria The input triangulation.
+   * @param[in] face_orientation <code>true</code> if the face is the not in
+   * standard orientation.
+   * @param[in] face_flip <code>true</code> if the face is rotated by +180
+   * degrees
+   * @param[in] face_rotation <code>true</code> if the face is rotated
+   * (additionally) by +90 degrees
+   * @param[in] manipulate_left_cube <code>true</code> if the left cube is
+   * to be re-ordered. If `false`, it is the right cube.
+   */
+  void non_standard_orientation_mesh(Triangulation<3> &tria,
+                                     const bool        face_orientation,
+                                     const bool        face_flip,
+                                     const bool        face_rotation,
+                                     const bool        manipulate_left_cube);
+
+
   /**
    * Creates a hyper sphere, i.e., a surface of a ball in @p spacedim
    * dimensions. This function only exists for dim+1=spacedim in 2 and 3 space
index b1d2070aaf44aec0692079a5964730380cb0356c..d0918d322e111d8ac26e0993ab4924def61c256f 100644 (file)
@@ -4990,6 +4990,354 @@ namespace GridGenerator
   }
 
 
+  void non_standard_orientation_mesh(Triangulation<2> &tria,
+                                     const bool        rotate_left_square,
+                                     const bool        rotate_right_square)
+  {
+    constexpr unsigned int dim = 2;
+
+    const unsigned int         n_cells = 2;
+    std::vector<CellData<dim>> cells(n_cells);
+
+    // Corner points of the cube [0,1]^2
+    const std::vector<Point<dim>> vertices = {Point<dim>(0, 0),  // 0
+                                              Point<dim>(1, 0),  // 1
+                                              Point<dim>(0, 1),  // 2
+                                              Point<dim>(1, 1),  // 3
+                                              Point<dim>(2, 0),  // 4
+                                              Point<dim>(2, 1)}; // 5
+
+
+    // consistent orientation
+    unsigned int cell_vertices[n_cells][4] = {{0, 1, 2, 3},  // unit cube
+                                              {1, 4, 3, 5}}; // shifted cube
+
+    // all 4 true-false combinations of (rotate_left_square | rotate_right_square) to a number 0..3
+    unsigned int this_case = 2 * rotate_left_square + rotate_right_square;
+
+    switch (this_case)
+      {
+        case /* rotate only right square */ 1:
+          {
+            cell_vertices[1][0] = 4;
+            cell_vertices[1][1] = 5;
+            cell_vertices[1][2] = 1;
+            cell_vertices[1][3] = 3;
+            break;
+          }
+
+        case /* rotate only left square */ 2:
+          {
+            cell_vertices[0][0] = 1;
+            cell_vertices[0][1] = 3;
+            cell_vertices[0][2] = 0;
+            cell_vertices[0][3] = 2;
+            break;
+          }
+
+        case /* rotate both squares (again consistent orientation) */ 3:
+          {
+            cell_vertices[0][0] = 1;
+            cell_vertices[0][1] = 3;
+            cell_vertices[0][2] = 0;
+            cell_vertices[0][3] = 2;
+
+            cell_vertices[1][0] = 4;
+            cell_vertices[1][1] = 5;
+            cell_vertices[1][2] = 1;
+            cell_vertices[1][3] = 3;
+            break;
+          }
+
+        default /* 0 */:
+          break;
+      } // switch
+
+    cells.resize(n_cells, CellData<dim>());
+
+    for (unsigned int cell_index = 0; cell_index < n_cells; ++cell_index)
+      {
+        for (const unsigned int vertex_index :
+             GeometryInfo<dim>::vertex_indices())
+          {
+            cells[cell_index].vertices[vertex_index] =
+              cell_vertices[cell_index][vertex_index];
+            cells[cell_index].material_id = 0;
+          }
+      }
+
+    tria.create_triangulation(vertices, cells, SubCellData());
+  }
+
+
+  void non_standard_orientation_mesh(Triangulation<3> &tria,
+                                     const bool        face_orientation,
+                                     const bool        face_flip,
+                                     const bool        face_rotation,
+                                     const bool        manipulate_left_cube)
+  {
+    constexpr unsigned int dim = 3;
+
+    const unsigned int         n_cells = 2;
+    std::vector<CellData<dim>> cells(n_cells);
+
+    // Corner points of the cube [0,1]^3
+    const std::vector<Point<dim>> vertices = {Point<dim>(0, 0, 0),  // 0
+                                              Point<dim>(1, 0, 0),  // 1
+                                              Point<dim>(0, 1, 0),  // 2
+                                              Point<dim>(1, 1, 0),  // 3
+                                              Point<dim>(0, 0, 1),  // 4
+                                              Point<dim>(1, 0, 1),  // 5
+                                              Point<dim>(0, 1, 1),  // 6
+                                              Point<dim>(1, 1, 1),  // 7
+                                              Point<dim>(2, 0, 0),  // 8
+                                              Point<dim>(2, 1, 0),  // 9
+                                              Point<dim>(2, 0, 1),  // 10
+                                              Point<dim>(2, 1, 1)}; // 11
+
+    unsigned int cell_vertices[n_cells][8] = {
+      {0, 1, 2, 3, 4, 5, 6, 7},    // unit cube
+      {1, 8, 3, 9, 5, 10, 7, 11}}; // shifted cube
+
+    // binary to case number
+    const unsigned int this_case =
+      4 * face_orientation + 2 * face_flip + face_rotation;
+
+    if (manipulate_left_cube)
+      {
+        switch (this_case)
+          {
+            case 0:
+              {
+                cell_vertices[0][0] = 1;
+                cell_vertices[0][1] = 0;
+                cell_vertices[0][2] = 5;
+                cell_vertices[0][3] = 4;
+                cell_vertices[0][4] = 3;
+                cell_vertices[0][5] = 2;
+                cell_vertices[0][6] = 7;
+                cell_vertices[0][7] = 6;
+                break;
+              }
+
+            case 1:
+              {
+                cell_vertices[0][0] = 5;
+                cell_vertices[0][1] = 4;
+                cell_vertices[0][2] = 7;
+                cell_vertices[0][3] = 6;
+                cell_vertices[0][4] = 1;
+                cell_vertices[0][5] = 0;
+                cell_vertices[0][6] = 3;
+                cell_vertices[0][7] = 2;
+                break;
+              }
+
+            case 2:
+              {
+                cell_vertices[0][0] = 7;
+                cell_vertices[0][1] = 6;
+                cell_vertices[0][2] = 3;
+                cell_vertices[0][3] = 2;
+                cell_vertices[0][4] = 5;
+                cell_vertices[0][5] = 4;
+                cell_vertices[0][6] = 1;
+                cell_vertices[0][7] = 0;
+                break;
+              }
+            case 3:
+              {
+                cell_vertices[0][0] = 3;
+                cell_vertices[0][1] = 2;
+                cell_vertices[0][2] = 1;
+                cell_vertices[0][3] = 0;
+                cell_vertices[0][4] = 7;
+                cell_vertices[0][5] = 6;
+                cell_vertices[0][6] = 5;
+                cell_vertices[0][7] = 4;
+                break;
+              }
+
+            case 4:
+              {
+                cell_vertices[0][0] = 0;
+                cell_vertices[0][1] = 1;
+                cell_vertices[0][2] = 2;
+                cell_vertices[0][3] = 3;
+                cell_vertices[0][4] = 4;
+                cell_vertices[0][5] = 5;
+                cell_vertices[0][6] = 6;
+                cell_vertices[0][7] = 7;
+                break;
+              }
+
+            case 5:
+              {
+                cell_vertices[0][0] = 2;
+                cell_vertices[0][1] = 3;
+                cell_vertices[0][2] = 6;
+                cell_vertices[0][3] = 7;
+                cell_vertices[0][4] = 0;
+                cell_vertices[0][5] = 1;
+                cell_vertices[0][6] = 4;
+                cell_vertices[0][7] = 5;
+                break;
+              }
+
+            case 6:
+              {
+                cell_vertices[0][0] = 6;
+                cell_vertices[0][1] = 7;
+                cell_vertices[0][2] = 4;
+                cell_vertices[0][3] = 5;
+                cell_vertices[0][4] = 2;
+                cell_vertices[0][5] = 3;
+                cell_vertices[0][6] = 0;
+                cell_vertices[0][7] = 1;
+                break;
+              }
+
+            case 7:
+              {
+                cell_vertices[0][0] = 4;
+                cell_vertices[0][1] = 5;
+                cell_vertices[0][2] = 0;
+                cell_vertices[0][3] = 1;
+                cell_vertices[0][4] = 6;
+                cell_vertices[0][5] = 7;
+                cell_vertices[0][6] = 2;
+                cell_vertices[0][7] = 3;
+                break;
+              }
+          } // switch
+      }
+    else
+      {
+        switch (this_case)
+          {
+            case 0:
+              {
+                cell_vertices[1][0] = 8;
+                cell_vertices[1][1] = 1;
+                cell_vertices[1][2] = 10;
+                cell_vertices[1][3] = 5;
+                cell_vertices[1][4] = 9;
+                cell_vertices[1][5] = 3;
+                cell_vertices[1][6] = 11;
+                cell_vertices[1][7] = 7;
+                break;
+              }
+
+            case 1:
+              {
+                cell_vertices[1][0] = 10;
+                cell_vertices[1][1] = 5;
+                cell_vertices[1][2] = 11;
+                cell_vertices[1][3] = 7;
+                cell_vertices[1][4] = 8;
+                cell_vertices[1][5] = 1;
+                cell_vertices[1][6] = 9;
+                cell_vertices[1][7] = 3;
+                break;
+              }
+
+            case 2:
+              {
+                cell_vertices[1][0] = 11;
+                cell_vertices[1][1] = 7;
+                cell_vertices[1][2] = 9;
+                cell_vertices[1][3] = 3;
+                cell_vertices[1][4] = 10;
+                cell_vertices[1][5] = 5;
+                cell_vertices[1][6] = 8;
+                cell_vertices[1][7] = 1;
+                break;
+              }
+
+            case 3:
+              {
+                cell_vertices[1][0] = 9;
+                cell_vertices[1][1] = 3;
+                cell_vertices[1][2] = 8;
+                cell_vertices[1][3] = 1;
+                cell_vertices[1][4] = 11;
+                cell_vertices[1][5] = 7;
+                cell_vertices[1][6] = 10;
+                cell_vertices[1][7] = 5;
+                break;
+              }
+
+            case 4:
+              {
+                cell_vertices[1][0] = 1;
+                cell_vertices[1][1] = 8;
+                cell_vertices[1][2] = 3;
+                cell_vertices[1][3] = 9;
+                cell_vertices[1][4] = 5;
+                cell_vertices[1][5] = 10;
+                cell_vertices[1][6] = 7;
+                cell_vertices[1][7] = 11;
+                break;
+              }
+
+            case 5:
+              {
+                cell_vertices[1][0] = 5;
+                cell_vertices[1][1] = 10;
+                cell_vertices[1][2] = 1;
+                cell_vertices[1][3] = 8;
+                cell_vertices[1][4] = 7;
+                cell_vertices[1][5] = 11;
+                cell_vertices[1][6] = 3;
+                cell_vertices[1][7] = 9;
+                break;
+              }
+
+            case 6:
+              {
+                cell_vertices[1][0] = 7;
+                cell_vertices[1][1] = 11;
+                cell_vertices[1][2] = 5;
+                cell_vertices[1][3] = 10;
+                cell_vertices[1][4] = 3;
+                cell_vertices[1][5] = 9;
+                cell_vertices[1][6] = 1;
+                cell_vertices[1][7] = 8;
+                break;
+              }
+
+            case 7:
+              {
+                cell_vertices[1][0] = 3;
+                cell_vertices[1][1] = 9;
+                cell_vertices[1][2] = 7;
+                cell_vertices[1][3] = 11;
+                cell_vertices[1][4] = 1;
+                cell_vertices[1][5] = 8;
+                cell_vertices[1][6] = 5;
+                cell_vertices[1][7] = 10;
+                break;
+              }
+          } // switch
+      }
+
+    cells.resize(n_cells, CellData<dim>());
+
+    for (unsigned int cell_index = 0; cell_index < n_cells; ++cell_index)
+      {
+        for (const unsigned int vertex_index :
+             GeometryInfo<dim>::vertex_indices())
+          {
+            cells[cell_index].vertices[vertex_index] =
+              cell_vertices[cell_index][vertex_index];
+            cells[cell_index].material_id = 0;
+          }
+      }
+
+    tria.create_triangulation(vertices, cells, SubCellData());
+  }
+
+
 
   template <int spacedim>
   void hyper_sphere(Triangulation<spacedim - 1, spacedim> &tria,
diff --git a/tests/fe/fe_conformity_dim_2_fe_abf.cc b/tests/fe/fe_conformity_dim_2_fe_abf.cc
new file mode 100644 (file)
index 0000000..23f589c
--- /dev/null
@@ -0,0 +1,96 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#include <deal.II/fe/fe_abf.h>
+#include <deal.II/fe/fe_tools.h>
+
+#include "../tests.h"
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+
+      constexpr int dim = 2;
+
+      // Test only up to order 2 since the FE constructor will throw an
+      // exception for higher order
+      for (unsigned int fe_degree = 0; fe_degree < 2; ++fe_degree)
+        {
+          // H(div) conformal
+          FE_ABF<dim> fe(fe_degree);
+
+          {
+            for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+                 ++this_switch)
+              {
+                deallog << std::endl
+                        << "*******   degree " << fe_degree
+                        << "   *******   orientation case " << this_switch
+                        << "   *******" << std::endl;
+
+                FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+                fe_conformity_tester.run();
+              }
+          }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
diff --git a/tests/fe/fe_conformity_dim_2_fe_abf.output b/tests/fe/fe_conformity_dim_2_fe_abf.output
new file mode 100644 (file)
index 0000000..d896a99
--- /dev/null
@@ -0,0 +1,193 @@
+
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 6
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 6
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 6
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 6
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 8
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 8
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 8
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_ABF<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 8
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_dim_2_fe_bdm.cc b/tests/fe/fe_conformity_dim_2_fe_bdm.cc
new file mode 100644 (file)
index 0000000..f2be693
--- /dev/null
@@ -0,0 +1,93 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#include <deal.II/fe/fe_bdm.h>
+
+#include "../tests.h"
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+
+      constexpr int dim = 2;
+
+      for (unsigned int fe_degree = 1; fe_degree < 5; ++fe_degree)
+        {
+          // H(div) conformal
+          FE_BDM<dim> fe(fe_degree);
+
+          {
+            for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+                 ++this_switch)
+              {
+                deallog << std::endl
+                        << "*******   degree " << fe_degree
+                        << "   *******   orientation case " << this_switch
+                        << "   *******" << std::endl;
+
+                FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+                fe_conformity_tester.run();
+              }
+          }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
diff --git a/tests/fe/fe_conformity_dim_2_fe_bdm.output b/tests/fe/fe_conformity_dim_2_fe_bdm.output
new file mode 100644 (file)
index 0000000..276451b
--- /dev/null
@@ -0,0 +1,385 @@
+
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 8
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 8
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 8
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 8
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 14
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 14
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 14
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 14
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 2
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 22
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 6
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 22
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 6
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 22
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 6
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 22
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 6
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 32
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 32
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 32
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_BDM<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 32
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_dim_2_fe_nedelec.cc b/tests/fe/fe_conformity_dim_2_fe_nedelec.cc
new file mode 100644 (file)
index 0000000..cacbea3
--- /dev/null
@@ -0,0 +1,93 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#include <deal.II/fe/fe_nedelec.h>
+
+#include "../tests.h"
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+
+      constexpr int dim = 2;
+
+      for (unsigned int fe_degree = 0; fe_degree < 5; ++fe_degree)
+        {
+          // H(curl) conformal
+          FE_Nedelec<dim> fe(fe_degree);
+
+          {
+            for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+                 ++this_switch)
+              {
+                deallog << std::endl
+                        << "*******   degree " << fe_degree
+                        << "   *******   orientation case " << this_switch
+                        << "   *******" << std::endl;
+
+                FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+                fe_conformity_tester.run();
+              }
+          }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
diff --git a/tests/fe/fe_conformity_dim_2_fe_nedelec.output b/tests/fe/fe_conformity_dim_2_fe_nedelec.output
new file mode 100644 (file)
index 0000000..01a5e24
--- /dev/null
@@ -0,0 +1,481 @@
+
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Nedelec<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_dim_2_fe_nedelec_sz.cc b/tests/fe/fe_conformity_dim_2_fe_nedelec_sz.cc
new file mode 100644 (file)
index 0000000..eaec8b5
--- /dev/null
@@ -0,0 +1,90 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#include <deal.II/fe/fe_nedelec_sz.h>
+
+#include "../tests.h"
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+      constexpr int dim = 2;
+
+      for (unsigned int fe_degree = 0; fe_degree < 5; ++fe_degree)
+        {
+          // H(curl) conformal
+          FE_NedelecSZ<dim> fe(fe_degree);
+
+          for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+               ++this_switch)
+            {
+              deallog << std::endl
+                      << "*******   degree " << fe_degree
+                      << "   *******   orientation case " << this_switch
+                      << "   *******" << std::endl;
+
+              FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+              fe_conformity_tester.run();
+            }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
\ No newline at end of file
diff --git a/tests/fe/fe_conformity_dim_2_fe_nedelec_sz.output b/tests/fe/fe_conformity_dim_2_fe_nedelec_sz.output
new file mode 100644 (file)
index 0000000..75e9bc8
--- /dev/null
@@ -0,0 +1,481 @@
+
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_NedelecSZ<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Tangential jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Tangential jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_dim_2_fe_q.cc b/tests/fe/fe_conformity_dim_2_fe_q.cc
new file mode 100644 (file)
index 0000000..81f4ae1
--- /dev/null
@@ -0,0 +1,77 @@
+#include <deal.II/fe/fe_q.h>
+
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+
+      constexpr int dim = 2;
+
+      for (unsigned int fe_degree = 1; fe_degree < 5; ++fe_degree)
+        {
+          // H1 conformal
+          FE_Q<dim> fe(fe_degree);
+
+          {
+            for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+                 ++this_switch)
+              {
+                deallog << std::endl
+                        << "*******   degree " << fe_degree
+                        << "   *******   orientation case " << this_switch
+                        << "   *******" << std::endl;
+
+                FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+                fe_conformity_tester.run();
+              }
+          }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
diff --git a/tests/fe/fe_conformity_dim_2_fe_q.output b/tests/fe/fe_conformity_dim_2_fe_q.output
new file mode 100644 (file)
index 0000000..160f420
--- /dev/null
@@ -0,0 +1,385 @@
+
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(1)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 0
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(1)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 0
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(1)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 0
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(1)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 0
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(2)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 9
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 1
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(2)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 9
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 1
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(2)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 9
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 1
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(2)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 9
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 1
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(3)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 6
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(3)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 6
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(3)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 6
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(3)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 16
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 6
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(4)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 25
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 9
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 7
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(4)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 25
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 9
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 7
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(4)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 25
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 9
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 7
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_Q<2>(4)
+DEAL::   is_primitive         : 1
+DEAL::   n_dofs_per_cell      : 25
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 9
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 1
+DEAL::
+DEAL::   first_line_index     : 4
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 2
+DEAL::   first_face_quad_index: 7
+DEAL::
+DEAL::   n_components         : 1
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Function jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Function jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_dim_2_fe_rt.cc b/tests/fe/fe_conformity_dim_2_fe_rt.cc
new file mode 100644 (file)
index 0000000..e6218c2
--- /dev/null
@@ -0,0 +1,93 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#include <deal.II/fe/fe_raviart_thomas.h>
+
+#include "../tests.h"
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+
+      constexpr int dim = 2;
+
+      for (unsigned int fe_degree = 0; fe_degree < 5; ++fe_degree)
+        {
+          // H(div) conformal
+          FE_RaviartThomas<dim> fe(fe_degree);
+
+          {
+            for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+                 ++this_switch)
+              {
+                deallog << std::endl
+                        << "*******   degree " << fe_degree
+                        << "   *******   orientation case " << this_switch
+                        << "   *******" << std::endl;
+
+                FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+                fe_conformity_tester.run();
+              }
+          }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
diff --git a/tests/fe/fe_conformity_dim_2_fe_rt.output b/tests/fe/fe_conformity_dim_2_fe_rt.output
new file mode 100644 (file)
index 0000000..d1298b0
--- /dev/null
@@ -0,0 +1,481 @@
+
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomas<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_dim_2_fe_rt_nodal.cc b/tests/fe/fe_conformity_dim_2_fe_rt_nodal.cc
new file mode 100644 (file)
index 0000000..2ee2ff2
--- /dev/null
@@ -0,0 +1,90 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#include <deal.II/fe/fe_raviart_thomas.h>
+
+#include "../tests.h"
+
+// STL
+#include <fstream>
+#include <iostream>
+
+// My test headers
+#include "fe_conformity_test.h"
+
+#define PRECISION 4
+
+int
+main(int, char **)
+{
+  std::ofstream logfile("output");
+  dealii::deallog << std::setprecision(PRECISION);
+  dealii::deallog << std::fixed;
+  logfile << std::setprecision(PRECISION);
+  logfile << std::fixed;
+  dealii::deallog.attach(logfile);
+
+  try
+    {
+      using namespace FEConforimityTest;
+      constexpr int dim = 2;
+
+      for (unsigned int fe_degree = 0; fe_degree < 5; ++fe_degree)
+        {
+          // H(div) conformal
+          FE_RaviartThomasNodal<dim> fe(fe_degree);
+
+          for (unsigned int this_switch = 0; this_switch < (dim == 2 ? 4 : 8);
+               ++this_switch)
+            {
+              deallog << std::endl
+                      << "*******   degree " << fe_degree
+                      << "   *******   orientation case " << this_switch
+                      << "   *******" << std::endl;
+
+              FEConformityTest<dim> fe_conformity_tester(fe, this_switch);
+              fe_conformity_tester.run();
+            }
+        } // ++fe_degree
+    }
+  catch (std::exception &exc)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Exception on processing: " << std::endl
+                << exc.what() << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+
+      return 1;
+    }
+  catch (...)
+    {
+      std::cerr << std::endl
+                << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      std::cerr << "Unknown exception!" << std::endl
+                << "Aborting!" << std::endl
+                << "----------------------------------------------------"
+                << std::endl;
+      return 1;
+    }
+
+  return 0;
+}
\ No newline at end of file
diff --git a/tests/fe/fe_conformity_dim_2_fe_rt_nodal.output b/tests/fe/fe_conformity_dim_2_fe_rt_nodal.output
new file mode 100644 (file)
index 0000000..efac6af
--- /dev/null
@@ -0,0 +1,481 @@
+
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 0   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(0)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 4
+DEAL::   n_dofs_per_face      : 1
+DEAL::   n_dofs_per_quad      : 0
+DEAL::   n_dofs_per_line      : 1
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 4
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 1
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 1   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(1)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 12
+DEAL::   n_dofs_per_face      : 2
+DEAL::   n_dofs_per_quad      : 4
+DEAL::   n_dofs_per_line      : 2
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 8
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 2
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 2   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(2)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 24
+DEAL::   n_dofs_per_face      : 3
+DEAL::   n_dofs_per_quad      : 12
+DEAL::   n_dofs_per_line      : 3
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 12
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 3
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 3   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(3)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 40
+DEAL::   n_dofs_per_face      : 4
+DEAL::   n_dofs_per_quad      : 24
+DEAL::   n_dofs_per_line      : 4
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 16
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 4
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 0   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 1   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   1
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 2   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   0
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::
+DEAL::*******   degree 4   *******   orientation case 3   *******
+DEAL::Element Info:  
+DEAL::   name                 : FE_RaviartThomasNodal<2>(4)
+DEAL::   is_primitive         : 0
+DEAL::   n_dofs_per_cell      : 60
+DEAL::   n_dofs_per_face      : 5
+DEAL::   n_dofs_per_quad      : 40
+DEAL::   n_dofs_per_line      : 5
+DEAL::   n_dofs_per_vertex    : 0
+DEAL::
+DEAL::   first_line_index     : 0
+DEAL::   first_quad_index     : 20
+DEAL::   first_face_line_index: 0
+DEAL::   first_face_quad_index: 5
+DEAL::
+DEAL::   n_components         : 2
+DEAL::   n_blocks             : 1
+DEAL::   n_base_elements      : 1
+DEAL::
+DEAL::Normal jumps (at quad points) in cell   0_0:   at face   2
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
+DEAL::Normal jumps (at quad points) in cell   1_0:   at face   3
+DEAL::   interface jumps:   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   
diff --git a/tests/fe/fe_conformity_fill_vector_random.h b/tests/fe/fe_conformity_fill_vector_random.h
new file mode 100644 (file)
index 0000000..319dfce
--- /dev/null
@@ -0,0 +1,86 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#pragma once
+
+#include <deal.II/lac/vector.h>
+
+#include <chrono>
+#include <fstream>
+#include <iostream>
+#include <map>
+#include <random>
+#include <typeinfo>
+#include <vector>
+
+namespace FEConforimityTest
+{
+  using namespace dealii;
+
+  /*
+   * Generate a random double number between [a,b)
+   */
+  class RandomNumberDouble
+  {
+  public:
+    RandomNumberDouble() = delete;
+
+    RandomNumberDouble(const double _a, const double _b);
+
+    double
+    generate();
+
+  private:
+    double a, b;
+
+    std::uniform_real_distribution<double> uniform_distribution;
+
+    uint64_t timeSeed;
+
+    std::seed_seq seed_sequence;
+
+    std::mt19937_64 rng;
+  };
+
+
+  RandomNumberDouble::RandomNumberDouble(const double _a, const double _b)
+    : a(_a)
+    , b(_b)
+    , uniform_distribution(a, b)
+    , timeSeed(
+        std::chrono::high_resolution_clock::now().time_since_epoch().count())
+    , seed_sequence({uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed >> 32)})
+  {
+    rng.seed(seed_sequence);
+  }
+
+  double
+  RandomNumberDouble::generate()
+  {
+    return uniform_distribution(rng);
+  }
+
+
+  void
+  fill_vector_randomly(Vector<double> &this_vector, double a = 0, double b = 1)
+  {
+    RandomNumberDouble random_double_generator(a, b);
+
+    for (auto &v : this_vector)
+      {
+        v = random_double_generator.generate();
+      }
+  }
+} // namespace FEConforimityTest
\ No newline at end of file
diff --git a/tests/fe/fe_conformity_test.h b/tests/fe/fe_conformity_test.h
new file mode 100644 (file)
index 0000000..53fc59e
--- /dev/null
@@ -0,0 +1,518 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 1998 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+#pragma once
+
+#include <deal.II/base/quadrature_lib.h>
+#include <deal.II/base/tensor.h>
+#include <deal.II/base/utilities.h>
+
+#include <deal.II/dofs/dof_accessor.h>
+#include <deal.II/dofs/dof_handler.h>
+#include <deal.II/dofs/dof_tools.h>
+
+#include <deal.II/fe/fe.h>
+#include <deal.II/fe/fe_base.h>
+#include <deal.II/fe/fe_interface_values.h>
+#include <deal.II/fe/fe_tools.h>
+#include <deal.II/fe/fe_values.h>
+
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/grid/grid_tools.h>
+#include <deal.II/grid/tria.h>
+#include <deal.II/grid/tria_accessor.h>
+#include <deal.II/grid/tria_iterator.h>
+
+#include <deal.II/lac/affine_constraints.h>
+
+// STL
+#include <fstream>
+#include <functional>
+#include <iostream>
+#include <map>
+#include <memory>
+#include <vector>
+
+// My test headers
+#include "fe_conformity_fill_vector_random.h"
+
+namespace FEConforimityTest
+{
+  using namespace dealii;
+
+  template <int dim>
+  class FEConformityTest
+  {
+  public:
+    FEConformityTest(const FiniteElement<dim> &fe,
+                     const unsigned int        config_switch);
+
+    void
+    run();
+
+  private:
+    void
+    make_grid();
+
+    void
+    make_dofs();
+
+    void
+    run_test();
+
+    void
+    get_function_jump(const FEInterfaceValues<dim> &fe_interface_values,
+                      const Vector<double> &        dof_vector,
+                      std::vector<double> &         jumps);
+
+    void
+    get_normal_jump(const FEInterfaceValues<dim> &fe_interface_values,
+                    const Vector<double> &        dof_vector,
+                    std::vector<double> &         jumps);
+
+    void
+    get_tangential_jump(const FEInterfaceValues<dim> &fe_interface_values,
+                        const Vector<double> &        dof_vector,
+                        std::vector<double> &         jumps);
+
+    SmartPointer<const FiniteElement<dim>> fe_ptr;
+    Triangulation<dim>                     triangulation;
+    DoFHandler<dim>                        dof_handler;
+    AffineConstraints<double>              constraints;
+
+    Vector<double> random_fe_funtion;
+
+    const unsigned int config_switch;
+
+    const bool plot_mesh_properties = false;
+  };
+
+  template <int dim>
+  FEConformityTest<dim>::FEConformityTest(const FiniteElement<dim> &_fe,
+                                          const unsigned int config_switch)
+    : fe_ptr(&_fe)
+    , dof_handler(triangulation)
+    , config_switch(config_switch)
+  {
+    deallog
+      << "Element Info:  " << std::endl
+      << "   name                 : " << fe_ptr->get_name() << std::endl
+      << "   is_primitive         : " << fe_ptr->is_primitive() << std::endl
+      << "   n_dofs_per_cell      : " << fe_ptr->dofs_per_cell << std::endl
+      << "   n_dofs_per_face      : " << fe_ptr->dofs_per_face << std::endl
+      << "   n_dofs_per_quad      : " << fe_ptr->dofs_per_quad << std::endl
+      << "   n_dofs_per_line      : " << fe_ptr->dofs_per_line << std::endl
+      << "   n_dofs_per_vertex    : " << fe_ptr->dofs_per_vertex << std::endl
+      << std::endl
+      << "   first_line_index     : " << fe_ptr->first_line_index << std::endl
+      << "   first_quad_index     : " << fe_ptr->first_quad_index << std::endl
+      << "   first_face_line_index: " << fe_ptr->first_face_line_index
+      << std::endl
+      << "   first_face_quad_index: " << fe_ptr->first_face_quad_index
+      << std::endl
+      << std::endl
+      << "   n_components         : " << fe_ptr->n_components() << std::endl
+      << "   n_blocks             : " << fe_ptr->n_blocks() << std::endl
+      << "   n_base_elements      : " << fe_ptr->n_base_elements() << std::endl
+      << std::endl;
+
+    if (dim == 2)
+      AssertThrow(config_switch < 4,
+                  ExcMessage("If dim=2 the config witch must be < 4."));
+
+    if (dim == 3)
+      AssertThrow(config_switch < 8,
+                  ExcMessage("If dim=3 the config witch must be < 8."));
+  }
+
+
+
+  template <>
+  void
+  FEConformityTest<3>::make_grid()
+  {
+    triangulation.clear();
+
+    bool face_orientation = (((config_switch / 4) % 2) == 1);
+    bool face_flip        = (((config_switch / 2) % 2) == 1);
+    bool face_rotation    = ((config_switch % 2) == 1);
+
+    bool manipulate_first_cube = true;
+
+    GridGenerator::non_standard_orientation_mesh(triangulation,
+                                                 face_orientation,
+                                                 face_flip,
+                                                 face_rotation,
+                                                 manipulate_first_cube);
+
+    //    GridTools::distort_random(/* factor */ 0.15,
+    //                              triangulation_coarse,
+    //                              /* keep_boundary */ false);
+
+    triangulation.refine_global(0);
+
+    if (plot_mesh_properties)
+      {
+        deallog << std::endl
+                << "3D Mesh properties: " << std::endl
+                << std::endl;
+        for (const auto &cell : triangulation.active_cell_iterators())
+          {
+            CellId current_cell_id(cell->id());
+
+            deallog
+              << "CellId = " << current_cell_id << std::endl
+              << "   {face_index -> face_orientation | face_flip | face_rotation}: "
+              << std::endl;
+            for (unsigned int face_index = 0;
+                 face_index < GeometryInfo<3>::faces_per_cell;
+                 ++face_index)
+              {
+                deallog << "      {" << face_index << " -> "
+                        << cell->face_orientation(face_index) << " | "
+                        << cell->face_flip(face_index) << " | "
+                        << cell->face_rotation(face_index) << "}" << std::endl;
+              } // face_index
+
+            deallog << "   {line_index -> line_orientation}: " << std::endl;
+            for (unsigned int line_index = 0;
+                 line_index < GeometryInfo<3>::lines_per_cell;
+                 ++line_index)
+              {
+                deallog << "      {" << line_index << " -> "
+                        << cell->line_orientation(line_index) << "}"
+                        << std::endl;
+              } // line_index
+          }     // cell
+      }         // plot_mesh_properties
+  }             // make_grid<3>()
+
+
+  template <>
+  void
+  FEConformityTest<2>::make_grid()
+  {
+    triangulation.clear();
+
+    const bool rotate_left_square  = (((config_switch / 2) % 2) == 1);
+    const bool rotate_right_square = ((config_switch % 2) == 1);
+
+    GridGenerator::non_standard_orientation_mesh(triangulation,
+                                                 rotate_left_square,
+                                                 rotate_right_square);
+
+    //    GridTools::distort_random(/* factor */ 0.15,
+    //                              triangulation_coarse,
+    //                              /* keep_boundary */ false);
+
+    triangulation.refine_global(0);
+
+    if (plot_mesh_properties)
+      {
+        deallog << std::endl
+                << "2D Mesh properties: " << std::endl
+                << std::endl;
+        for (const auto &cell : triangulation.active_cell_iterators())
+          {
+            CellId current_cell_id(cell->id());
+
+            deallog << "CellId = " << current_cell_id << std::endl
+                    << "   {face_index -> face_orientation}: " << std::endl;
+            for (unsigned int face_index = 0;
+                 face_index < GeometryInfo<2>::faces_per_cell;
+                 ++face_index)
+              {
+                deallog << "      {" << face_index << " -> "
+                        << cell->face_orientation(face_index) << "}"
+                        << std::endl;
+              } // face_index
+
+            deallog << "   {line_index -> line_orientation}: " << std::endl;
+            for (unsigned int line_index = 0;
+                 line_index < GeometryInfo<2>::lines_per_cell;
+                 ++line_index)
+              {
+                deallog << "      {" << line_index << " -> "
+                        << cell->line_orientation(line_index) << "}"
+                        << std::endl;
+              } // line_index
+          }     // cell
+      }         // plot_mesh_properties
+  }             // make_grid<2>()
+
+
+  template <int dim>
+  void
+  FEConformityTest<dim>::make_dofs()
+  {
+    dof_handler.clear();
+    constraints.clear();
+
+    dof_handler.distribute_dofs(*fe_ptr);
+
+    { // Constraints
+      constraints.clear();
+      DoFTools::make_hanging_node_constraints(dof_handler, constraints);
+      constraints.close();
+    }
+
+    random_fe_funtion.reinit(dof_handler.n_dofs());
+
+    // Fill vector with pseudo-random values
+    fill_vector_randomly(random_fe_funtion, /* min */ -5.0, /* max */ 5.0);
+  } // make_dofs()
+
+
+
+  template <int dim>
+  void
+  FEConformityTest<dim>::get_function_jump(
+    const FEInterfaceValues<dim> &fe_interface_values,
+    const Vector<double> &        dof_vector,
+    std::vector<double> &         jumps)
+  {
+    const unsigned n_q = fe_interface_values.n_quadrature_points;
+
+    Assert(jumps.size() == n_q,
+           ExcMessage(
+             "Length of \"jumps\" and number of quad points must coincide"));
+
+    std::array<std::vector<double>, 2> face_values;
+    for (unsigned i = 0; i < 2; ++i)
+      {
+        face_values[i].resize(n_q);
+        fe_interface_values.get_fe_face_values(i).get_function_values(
+          dof_vector, face_values[i]);
+      }
+
+    for (unsigned int q = 0; q < n_q; ++q)
+      jumps[q] = face_values[0][q] - face_values[1][q];
+  } // get_function_jump()
+
+
+
+  template <int dim>
+  void
+  FEConformityTest<dim>::get_normal_jump(
+    const FEInterfaceValues<dim> &fe_interface_values,
+    const Vector<double> &        dof_vector,
+    std::vector<double> &         jumps)
+  {
+    const unsigned n_q = fe_interface_values.n_quadrature_points;
+
+    Assert(jumps.size() == n_q,
+           ExcMessage(
+             "Length of \"jumps\" and number of quad points must coincide"));
+
+    const FEValuesExtractors::Vector normal_flux(0);
+
+    std::array<std::vector<Tensor<1, dim>>, 2> face_values;
+    for (unsigned i = 0; i < 2; ++i)
+      {
+        face_values[i].resize(n_q);
+
+        const auto &fe_face_values = fe_interface_values.get_fe_face_values(i);
+
+        fe_face_values[normal_flux].get_function_values(dof_vector,
+                                                        face_values[i]);
+      }
+
+    const std::vector<Tensor<1, dim>> interface_normals =
+      fe_interface_values.get_normal_vectors();
+
+    for (unsigned int q = 0; q < n_q; ++q)
+      {
+        jumps[q] =
+          (face_values[0][q] - face_values[1][q]) * interface_normals[q];
+      }
+  } // get_normal_jump()
+
+
+
+  template <>
+  void
+  FEConformityTest<2>::get_tangential_jump(
+    const FEInterfaceValues<2> &fe_interface_values,
+    const Vector<double> &      dof_vector,
+    std::vector<double> &       jumps)
+  {
+    const unsigned n_q = fe_interface_values.n_quadrature_points;
+
+    Assert(jumps.size() == n_q,
+           ExcMessage(
+             "Length of \"jumps\" and number of quad points must coincide"));
+
+    const FEValuesExtractors::Vector tangent_flux(0);
+
+    std::array<std::vector<Tensor<1, 2>>, 2> face_values;
+    for (unsigned i = 0; i < 2; ++i)
+      {
+        face_values[i].resize(n_q);
+
+        const auto &fe_face_values = fe_interface_values.get_fe_face_values(i);
+
+        fe_face_values[tangent_flux].get_function_values(dof_vector,
+                                                         face_values[i]);
+      }
+
+    const std::vector<Tensor<1, 2>> interface_normals =
+      fe_interface_values.get_normal_vectors();
+
+    for (unsigned int q = 0; q < n_q; ++q)
+      jumps[q] = cross_product_2d(face_values[0][q] - face_values[1][q]) *
+                 interface_normals[q];
+  } // get_tangential_jump()
+
+
+
+  template <>
+  void
+  FEConformityTest<3>::get_tangential_jump(
+    const FEInterfaceValues<3> &fe_interface_values,
+    const Vector<double> &      dof_vector,
+    std::vector<double> &       jumps)
+  {
+    const unsigned n_q = fe_interface_values.n_quadrature_points;
+
+    Assert(jumps.size() == n_q,
+           ExcMessage(
+             "Length of \"jumps\" and number of quad points must coincide"));
+
+    const FEValuesExtractors::Vector tangent_flux(0);
+
+    std::array<std::vector<Tensor<1, 3>>, 2> face_values;
+    for (unsigned i = 0; i < 2; ++i)
+      {
+        face_values[i].resize(n_q);
+
+        const auto &fe_face_values = fe_interface_values.get_fe_face_values(i);
+
+        fe_face_values[tangent_flux].get_function_values(dof_vector,
+                                                         face_values[i]);
+      }
+
+    const std::vector<Tensor<1, 3>> interface_normals =
+      fe_interface_values.get_normal_vectors();
+
+    for (unsigned int q = 0; q < n_q; ++q)
+      jumps[q] = cross_product_3d(face_values[0][q] - face_values[1][q],
+                                  interface_normals[q])
+                   .norm();
+  } // get_tangential_jump()
+
+
+
+  template <int dim>
+  void
+  FEConformityTest<dim>::run_test()
+  {
+    QGauss<dim - 1>    interface_quad_rule(fe_ptr->degree + 2);
+    const unsigned int n_interface_q_points = interface_quad_rule.size();
+
+    const UpdateFlags interface_update_flags =
+      (update_values | update_quadrature_points | update_JxW_values |
+       update_normal_vectors);
+
+    FEInterfaceValues<dim> fe_interface_values(*fe_ptr,
+                                               interface_quad_rule,
+                                               interface_update_flags);
+
+    std::vector<double> interface_jumps(n_interface_q_points);
+
+    // Loop over all (two) cells and faces. If at inner face check for
+    // appropriate jumps.
+    for (const auto &cell : dof_handler.active_cell_iterators())
+      {
+        for (unsigned int face_index = 0;
+             face_index < GeometryInfo<dim>::faces_per_cell;
+             ++face_index)
+          {
+            if (cell->face(face_index)->at_boundary())
+              continue;
+
+            fe_interface_values.reinit(
+              cell,
+              face_index,
+              /* sub_face_no */ numbers::invalid_unsigned_int,
+              /* cell_neighbor */ cell->neighbor(face_index),
+              /* face_no_neighbor */ cell->neighbor_face_no(face_index),
+              /* sub_face_no_neighbor */ numbers::invalid_unsigned_int);
+
+            switch (fe_ptr->conforming_space)
+              {
+                case FiniteElementData<dim>::Conformity::H1:
+                  {
+                    get_function_jump(fe_interface_values,
+                                      random_fe_funtion,
+                                      interface_jumps);
+
+                    deallog << "Function jumps (at quad points) in cell   "
+                            << cell->id().to_string() << "   at face   "
+                            << face_index << std::endl;
+
+                    break;
+                  } // H1
+
+                case FiniteElementData<dim>::Conformity::Hdiv:
+                  {
+                    get_normal_jump(fe_interface_values,
+                                    random_fe_funtion,
+                                    interface_jumps);
+
+                    deallog << "Normal jumps (at quad points) in cell   "
+                            << cell->id().to_string() << "   at face   "
+                            << face_index << std::endl;
+
+                    break;
+                  } // case H(div)
+
+                case FiniteElementData<dim>::Conformity::Hcurl:
+                  {
+                    get_tangential_jump(fe_interface_values,
+                                        random_fe_funtion,
+                                        interface_jumps);
+
+                    deallog << "Tangential jumps (at quad points) in cell   "
+                            << cell->id().to_string() << "   at face   "
+                            << face_index << std::endl;
+                    break;
+                  } // case H(curl)
+
+                default:
+                  break;
+              } // switch (fe_ptr->conforming_space)
+
+            // loop over quad_points and print jumps
+            deallog << "   interface jumps:   ";
+            for (unsigned int q = 0; q < n_interface_q_points; ++q)
+              {
+                deallog << interface_jumps[q] << "   ";
+              }
+            deallog << std::endl;
+          } // face_index
+      }     // cell
+  }         // run_test()
+
+
+
+  template <int dim>
+  void
+  FEConformityTest<dim>::run()
+  {
+    make_grid();
+    make_dofs();
+    run_test();
+  }
+} // namespace FEConforimityTest
\ No newline at end of file
diff --git a/tests/grid/grid_generator_non_standard_orientation_mesh_2d.cc b/tests/grid/grid_generator_non_standard_orientation_mesh_2d.cc
new file mode 100644 (file)
index 0000000..0ac6b74
--- /dev/null
@@ -0,0 +1,105 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2003 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+
+/*
+ * Small test to analyse the equivalence of the normal component
+ * on the element edges for the Raviart-Thomas elements.
+ */
+
+
+
+#include "../tests.h"
+
+#define PRECISION 8
+
+#include <deal.II/grid/grid_generator.h>
+
+// STL
+#include <map>
+
+std::ofstream logfile("output");
+
+using namespace dealii;
+
+template <int dim>
+void
+plot_all_info(const Triangulation<dim> &tria)
+{
+  for (const auto &cell : tria.active_cell_iterators())
+    {
+      CellId current_cell_id(cell->id());
+
+      deallog << "CellId = " << current_cell_id << std::endl
+              << "   {line_index -> face_orientation}: " << std::endl;
+      for (unsigned int face_index = 0;
+           face_index < GeometryInfo<dim>::faces_per_cell;
+           ++face_index)
+        {
+          deallog << "      {" << face_index << " -> "
+                  << cell->face_orientation(face_index) << "} " << std::endl;
+        } // face_index
+
+      // in 2D faces that are not consistently oriented should of course be also
+      // lines with the same property
+      deallog << "   line orientation: {  ";
+      for (unsigned int line_index = 0;
+           line_index < GeometryInfo<dim>::lines_per_cell;
+           ++line_index)
+        {
+          deallog << cell->line_orientation(line_index) << "  ";
+        } // line_index
+      deallog << "}" << std::endl << std::endl;
+    } // cell
+}
+
+
+int
+main(int /*argc*/, char ** /*argv*/)
+{
+  deallog << std::setprecision(PRECISION);
+  deallog << std::fixed;
+  deallog.attach(logfile);
+
+  /*
+   * 3D test only
+   */
+  const int          dim = 2;
+  Triangulation<dim> tria_test;
+
+  deallog << "Testing 2D mesh for orientation tests:" << std::endl;
+
+  for (unsigned int config_switch = 0; config_switch < 4; ++config_switch)
+    {
+      tria_test.clear();
+
+      bool rotate_left_square  = (((config_switch / 2) % 2) == 1);
+      bool rotate_right_square = ((config_switch % 2) == 1);
+
+      bool manipulate_first_cube = true;
+
+      GridGenerator::non_standard_orientation_mesh(tria_test,
+                                                   rotate_left_square,
+                                                   rotate_right_square);
+
+      plot_all_info(tria_test);
+
+      deallog << "****************" << std::endl;
+    } // config_switch++
+
+  deallog << "Testing 2D orientation mesh done." << std::endl;
+
+  return 0;
+}
diff --git a/tests/grid/grid_generator_non_standard_orientation_mesh_2d.output b/tests/grid/grid_generator_non_standard_orientation_mesh_2d.output
new file mode 100644 (file)
index 0000000..08e30eb
--- /dev/null
@@ -0,0 +1,71 @@
+
+DEAL::Testing 2D mesh for orientation tests:
+DEAL::CellId = 0_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {line_index -> face_orientation}: 
+DEAL::      {0 -> 1} 
+DEAL::      {1 -> 1} 
+DEAL::      {2 -> 1} 
+DEAL::      {3 -> 1} 
+DEAL::   line orientation: {  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::Testing 2D orientation mesh done.
diff --git a/tests/grid/grid_generator_non_standard_orientation_mesh_3d.cc b/tests/grid/grid_generator_non_standard_orientation_mesh_3d.cc
new file mode 100644 (file)
index 0000000..cc5d5f5
--- /dev/null
@@ -0,0 +1,110 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2003 - 2020 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.
+//
+// ---------------------------------------------------------------------
+
+
+/*
+ * Small test to analyse the equivalence of the normal component
+ * on the element edges for the Raviart-Thomas elements.
+ */
+
+
+
+#include "../tests.h"
+
+#define PRECISION 8
+
+#include <deal.II/grid/grid_generator.h>
+
+// STL
+#include <map>
+
+std::ofstream logfile("output");
+
+
+using namespace dealii;
+
+template <int dim>
+void
+plot_all_info(const Triangulation<dim> &tria)
+{
+  for (const auto &cell : tria.active_cell_iterators())
+    {
+      CellId current_cell_id(cell->id());
+
+      deallog << "CellId = " << current_cell_id << std::endl
+              << "   {index -> face_orientation | face_flip | face_rotation}: "
+              << std::endl;
+      for (unsigned int face_index = 0;
+           face_index < GeometryInfo<dim>::faces_per_cell;
+           ++face_index)
+        {
+          deallog << "      {" << face_index << " -> "
+                  << cell->face_orientation(face_index) << " | "
+                  << cell->face_flip(face_index) << " | "
+                  << cell->face_rotation(face_index) << " } " << std::endl;
+        } // face_index
+
+      deallog << "   line orientation: {  ";
+      for (unsigned int line_index = 0;
+           line_index < GeometryInfo<dim>::lines_per_cell;
+           ++line_index)
+        {
+          deallog << cell->line_orientation(line_index) << "  ";
+        } // line_index
+      deallog << "}" << std::endl << std::endl;
+    } // cell
+}
+
+
+int
+main(int /*argc*/, char ** /*argv*/)
+{
+  deallog << std::setprecision(PRECISION);
+  deallog << std::fixed;
+  deallog.attach(logfile);
+
+  /*
+   * 3D test only
+   */
+  const int          dim = 3;
+  Triangulation<dim> tria_test;
+
+  deallog << "Testing 3D mesh for orientation tests:" << std::endl;
+
+  for (unsigned int config_switch = 0; config_switch < 8; ++config_switch)
+    {
+      tria_test.clear();
+
+      bool face_orientation = (((config_switch / 4) % 2) == 1);
+      bool face_flip        = (((config_switch / 2) % 2) == 1);
+      bool face_rotation    = ((config_switch % 2) == 1);
+
+      bool manipulate_first_cube = true;
+
+      GridGenerator::non_standard_orientation_mesh(tria_test,
+                                                   face_orientation,
+                                                   face_flip,
+                                                   face_rotation,
+                                                   manipulate_first_cube);
+
+      plot_all_info(tria_test);
+
+      deallog << "****************" << std::endl;
+    } // config_switch++
+
+  deallog << "Testing 3D orientation mesh done." << std::endl;
+
+  return 0;
+}
diff --git a/tests/grid/grid_generator_non_standard_orientation_mesh_3d.output b/tests/grid/grid_generator_non_standard_orientation_mesh_3d.output
new file mode 100644 (file)
index 0000000..5fd236a
--- /dev/null
@@ -0,0 +1,171 @@
+
+DEAL::Testing 3D mesh for orientation tests:
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 0 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 0 | 0 | 1 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  0  1  0  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 0 | 1 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  0  1  1  1  0  1  1  1  0  1  0  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 0 | 1 | 1 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  0  1  1  1  0  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 1 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  0  1  1  1  0  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 1 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  0  1  1  1  0  1  1  1  0  1  0  1  }
+DEAL::
+DEAL::****************
+DEAL::CellId = 0_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 0 | 0 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  1  1  1  1  }
+DEAL::
+DEAL::CellId = 1_0:
+DEAL::   {index -> face_orientation | face_flip | face_rotation}: 
+DEAL::      {0 -> 1 | 1 | 1 } 
+DEAL::      {1 -> 1 | 0 | 0 } 
+DEAL::      {2 -> 1 | 0 | 0 } 
+DEAL::      {3 -> 1 | 0 | 0 } 
+DEAL::      {4 -> 1 | 0 | 0 } 
+DEAL::      {5 -> 1 | 0 | 0 } 
+DEAL::   line orientation: {  1  1  1  1  1  1  1  1  0  1  0  1  }
+DEAL::
+DEAL::****************
+DEAL::Testing 3D orientation mesh done.

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.