]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Improve asserts in MF/FEEval regarding FENothing 13690/head
authorPeter Munch <peterrmuench@gmail.com>
Sat, 7 May 2022 21:25:13 +0000 (23:25 +0200)
committerPeter Munch <peterrmuench@gmail.com>
Sun, 8 May 2022 18:36:52 +0000 (20:36 +0200)
include/deal.II/matrix_free/fe_evaluation.h
include/deal.II/matrix_free/matrix_free.h
include/deal.II/matrix_free/util.h

index 5c80c2f99480d2478da358377f6980880520c2df..120e9dbb3164a9dc318093bc5b91eb901ff17047 100644 (file)
@@ -6599,6 +6599,19 @@ FEEvaluation<dim,
   (void)dof_no;
   (void)first_selected_component;
 
+  Assert(
+    this->data->dofs_per_component_on_cell > 0,
+    ExcMessage(
+      "There is nothing useful you can do with an FEEvaluation object with "
+      "FE_Nothing, i.e., without DoFs! If you have passed to "
+      "MatrixFree::reinit() a collection of finite elements also containing "
+      "FE_Nothing, please check - before creating FEEvaluation - the category "
+      "of the current range by calling either "
+      "MatrixFree::get_cell_range_category(range) or "
+      "MatrixFree::get_face_range_category(range). The returned category "
+      "is the index of the active FE, which you can use to exclude "
+      "FE_Nothing."));
+
 #  ifdef DEBUG
   // print error message when the dimensions do not match. Propose a possible
   // fix
index f977f5d9047f4e3a254f3e7190f3faf1b37bdf1b..da75ab3aaaa3eaee8d4033b2ebde0cb0d05158dc 100644 (file)
@@ -1884,6 +1884,24 @@ public:
   get_face_quadrature(const unsigned int quad_index         = 0,
                       const unsigned int hp_active_fe_index = 0) const;
 
+  /**
+   * Return the category the current batch range of cells was assigned to.
+   * Categories run between the given values in the field
+   * AdditionalData::cell_vectorization_category for non-hp-DoFHandler types
+   * and return the active FE index in the hp-adaptive case.
+   */
+  unsigned int
+  get_cell_range_category(
+    const std::pair<unsigned int, unsigned int> cell_batch_range) const;
+
+  /**
+   * Return the category of the cells on the two sides of the current batch
+   * range of faces.
+   */
+  std::pair<unsigned int, unsigned int>
+  get_face_range_category(
+    const std::pair<unsigned int, unsigned int> face_batch_range) const;
+
   /**
    * Return the category the current batch of cells was assigned to. Categories
    * run between the given values in the field
@@ -1894,7 +1912,7 @@ public:
   get_cell_category(const unsigned int cell_batch_index) const;
 
   /**
-   * Return the category on the cells on the two sides of the current batch of
+   * Return the category of the cells on the two sides of the current batch of
    * faces.
    */
   std::pair<unsigned int, unsigned int>
@@ -2780,6 +2798,44 @@ MatrixFree<dim, Number, VectorizedArrayType>::get_face_quadrature(
 
 
 
+template <int dim, typename Number, typename VectorizedArrayType>
+inline unsigned int
+MatrixFree<dim, Number, VectorizedArrayType>::get_cell_range_category(
+  const std::pair<unsigned int, unsigned int> range) const
+{
+  const auto result = get_cell_category(range.first);
+
+#  ifdef DEBUG
+  for (unsigned int i = range.first; i < range.second; ++i)
+    Assert(result == get_cell_category(i),
+           ExcMessage(
+             "The cell batches of the range have different categories!"));
+#  endif
+
+  return result;
+}
+
+
+
+template <int dim, typename Number, typename VectorizedArrayType>
+inline std::pair<unsigned int, unsigned int>
+MatrixFree<dim, Number, VectorizedArrayType>::get_face_range_category(
+  const std::pair<unsigned int, unsigned int> range) const
+{
+  const auto result = get_face_category(range.first);
+
+#  ifdef DEBUG
+  for (unsigned int i = range.first; i < range.second; ++i)
+    Assert(result == get_face_category(i),
+           ExcMessage(
+             "The face batches of the range have different categories!"));
+#  endif
+
+  return result;
+}
+
+
+
 template <int dim, typename Number, typename VectorizedArrayType>
 inline unsigned int
 MatrixFree<dim, Number, VectorizedArrayType>::get_cell_category(
index 323f2093e0486ddbda5fd2f2a2c6c8e14d2dee0a..b0b01f6fe192458f852c2e3df5b1513dfb2163d8 100644 (file)
@@ -110,6 +110,13 @@ namespace internal
     inline std::pair<Quadrature<dim - 1>, Quadrature<dim - 1>>
     get_unique_face_quadratures(const Quadrature<dim> &quad)
     {
+      AssertThrow(
+        quad.size() > 0,
+        ExcMessage(
+          "There is nothing useful you can do with a MatrixFree/FEEvaluation "
+          "object when using a quadrature formula with zero "
+          "quadrature points!"));
+
       if (dim == 2 || dim == 3)
         {
           for (unsigned int i = 1; i <= 4; ++i)

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.