]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add assertions that we can only combine elements defined on the same reference cell.
authorWolfgang Bangerth <bangerth@colostate.edu>
Mon, 20 May 2024 20:16:28 +0000 (14:16 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Tue, 21 May 2024 13:59:06 +0000 (07:59 -0600)
include/deal.II/fe/fe_system.h
include/deal.II/fe/fe_tools.templates.h
source/fe/fe_system.cc

index 68c1c724db0a7acae82d0ff71d8698cf64760395..4e3ad8d6bafe448cd9b367bdd25c1be6a1af5d45 100644 (file)
@@ -1428,6 +1428,17 @@ FESystem<dim, spacedim>::FESystem(
   for (const auto &p : fe_systems)
     extract(p);
 
+  const ReferenceCell reference_cell = fes.front()->reference_cell();
+  (void)reference_cell;
+  Assert(std::all_of(fes.begin(),
+                     fes.end(),
+                     [reference_cell](const FiniteElement<dim, spacedim> *fe) {
+                       return fe->reference_cell() == reference_cell;
+                     }),
+         ExcMessage("You cannot combine finite elements defined on "
+                    "different reference cells into a combined element "
+                    "such as an FESystem or FE_Enriched object."));
+
   initialize(fes, multiplicities);
 }
 #  endif
index 33d25c70adb9447b8accd77eaefcd096a75922e0..effb9c803bac9931b7c501a90f84c3c6eaa274a4 100644 (file)
@@ -198,8 +198,18 @@ namespace FETools
         for (unsigned int m = 0; m < multiplicities[base]; ++m)
           block_indices.push_back(fes[base]->n_dofs_per_cell());
 
+      const ReferenceCell reference_cell = fes.front()->reference_cell();
+      Assert(std::all_of(fes.begin(),
+                         fes.end(),
+                         [reference_cell](
+                           const FiniteElement<dim, spacedim> *fe) {
+                           return fe->reference_cell() == reference_cell;
+                         }),
+             ExcMessage("You cannot combine finite elements defined on "
+                        "different reference cells into a combined element "
+                        "such as an FESystem or FE_Enriched object."));
       return FiniteElementData<dim>(dpo,
-                                    fes.front()->reference_cell(),
+                                    reference_cell,
                                     (do_tensor_product ?
                                        multiplied_n_components :
                                        n_components),
@@ -249,6 +259,17 @@ namespace FETools
     {
       AssertDimension(fes.size(), multiplicities.size());
 
+      const ReferenceCell reference_cell = fes.front()->reference_cell();
+      Assert(std::all_of(fes.begin(),
+                         fes.end(),
+                         [reference_cell](
+                           const FiniteElement<dim, spacedim> *fe) {
+                           return fe->reference_cell() == reference_cell;
+                         }),
+             ExcMessage("You cannot combine finite elements defined on "
+                        "different reference cells into a combined element "
+                        "such as an FESystem or FE_Enriched object."));
+
       // first count the number of dofs and components that will emerge from the
       // given FEs
       unsigned int n_shape_functions = 0;
@@ -268,8 +289,7 @@ namespace FETools
       // for each shape function, copy the flags from the base element to this
       // one, taking into account multiplicities, and other complications
       unsigned int total_index = 0;
-      for (const unsigned int vertex_number :
-           fes.front()->reference_cell().vertex_indices())
+      for (const unsigned int vertex_number : reference_cell.vertex_indices())
         {
           for (unsigned int base = 0; base < fes.size(); ++base)
             for (unsigned int m = 0; m < multiplicities[base]; ++m)
@@ -289,8 +309,7 @@ namespace FETools
         }
 
       // 2. Lines
-      for (const unsigned int line_number :
-           fes.front()->reference_cell().line_indices())
+      for (const unsigned int line_number : reference_cell.line_indices())
         {
           for (unsigned int base = 0; base < fes.size(); ++base)
             for (unsigned int m = 0; m < multiplicities[base]; ++m)
@@ -312,9 +331,7 @@ namespace FETools
       // 3. Quads
       for (unsigned int quad_number = 0;
            quad_number <
-           (dim == 2 ?
-              1 :
-              (dim == 3 ? fes.front()->reference_cell().n_faces() : 0));
+           (dim == 2 ? 1 : (dim == 3 ? reference_cell.n_faces() : 0));
            ++quad_number)
         {
           for (unsigned int base = 0; base < fes.size(); ++base)
@@ -409,6 +426,18 @@ namespace FETools
         fes.size() > 0,
         ExcMessage(
           "This function only makes sense if at least one FiniteElement is provided."));
+
+      const ReferenceCell reference_cell = fes.front()->reference_cell();
+      Assert(std::all_of(fes.begin(),
+                         fes.end(),
+                         [reference_cell](
+                           const FiniteElement<dim, spacedim> *fe) {
+                           return fe->reference_cell() == reference_cell;
+                         }),
+             ExcMessage("You cannot combine finite elements defined on "
+                        "different reference cells into a combined element "
+                        "such as an FESystem or FE_Enriched object."));
+
       // first count the number of dofs and components that will emerge from the
       // given FEs
       unsigned int n_shape_functions = 0;
@@ -454,8 +483,7 @@ namespace FETools
       // to this one, taking into account multiplicities, multiple components in
       // base elements, and other complications
       unsigned int total_index = 0;
-      for (const unsigned int vertex_number :
-           fes.front()->reference_cell().vertex_indices())
+      for (const unsigned int vertex_number : reference_cell.vertex_indices())
         {
           unsigned int comp_start = 0;
           for (unsigned int base = 0; base < fes.size(); ++base)
@@ -487,8 +515,7 @@ namespace FETools
         }
 
       // 2. Lines
-      for (const unsigned int line_number :
-           fes.front()->reference_cell().line_indices())
+      for (const unsigned int line_number : reference_cell.line_indices())
         {
           unsigned int comp_start = 0;
           for (unsigned int base = 0; base < fes.size(); ++base)
@@ -522,9 +549,7 @@ namespace FETools
       // 3. Quads
       for (unsigned int quad_number = 0;
            quad_number <
-           (dim == 2 ?
-              1 :
-              (dim == 3 ? fes.front()->reference_cell().n_faces() : 0));
+           (dim == 2 ? 1 : (dim == 3 ? reference_cell.n_faces() : 0));
            ++quad_number)
         {
           unsigned int comp_start = 0;
index 6825732313858b1bcdcf909da5ea0d1c93881f58..2162db2865fcc9702c5761c5d6396db325dda8d5 100644 (file)
@@ -333,6 +333,18 @@ FESystem<dim, spacedim>::FESystem(const FiniteElement<dim, spacedim> &fe1,
 {
   const std::vector<const FiniteElement<dim, spacedim> *> fes = {&fe1, &fe2};
   const std::vector<unsigned int> multiplicities              = {n1, n2};
+
+  const ReferenceCell reference_cell = fes.front()->reference_cell();
+  (void)reference_cell;
+  Assert(std::all_of(fes.begin(),
+                     fes.end(),
+                     [reference_cell](const FiniteElement<dim, spacedim> *fe) {
+                       return fe->reference_cell() == reference_cell;
+                     }),
+         ExcMessage("You cannot combine finite elements defined on "
+                    "different reference cells into a combined element "
+                    "such as an FESystem or FE_Enriched object."));
+
   initialize(fes, multiplicities);
 }
 
@@ -363,6 +375,18 @@ FESystem<dim, spacedim>::FESystem(const FiniteElement<dim, spacedim> &fe1,
                                                                  &fe2,
                                                                  &fe3};
   const std::vector<unsigned int> multiplicities              = {n1, n2, n3};
+
+  const ReferenceCell reference_cell = fes.front()->reference_cell();
+  (void)reference_cell;
+  Assert(std::all_of(fes.begin(),
+                     fes.end(),
+                     [reference_cell](const FiniteElement<dim, spacedim> *fe) {
+                       return fe->reference_cell() == reference_cell;
+                     }),
+         ExcMessage("You cannot combine finite elements defined on "
+                    "different reference cells into a combined element "
+                    "such as an FESystem or FE_Enriched object."));
+
   initialize(fes, multiplicities);
 }
 
@@ -396,6 +420,18 @@ FESystem<dim, spacedim>::FESystem(const FiniteElement<dim, spacedim> &fe1,
                                                                  &fe3,
                                                                  &fe4};
   const std::vector<unsigned int> multiplicities = {n1, n2, n3, n4};
+
+  const ReferenceCell reference_cell = fes.front()->reference_cell();
+  (void)reference_cell;
+  Assert(std::all_of(fes.begin(),
+                     fes.end(),
+                     [reference_cell](const FiniteElement<dim, spacedim> *fe) {
+                       return fe->reference_cell() == reference_cell;
+                     }),
+         ExcMessage("You cannot combine finite elements defined on "
+                    "different reference cells into a combined element "
+                    "such as an FESystem or FE_Enriched object."));
+
   initialize(fes, multiplicities);
 }
 
@@ -430,6 +466,18 @@ FESystem<dim, spacedim>::FESystem(const FiniteElement<dim, spacedim> &fe1,
   const std::vector<const FiniteElement<dim, spacedim> *> fes = {
     &fe1, &fe2, &fe3, &fe4, &fe5};
   const std::vector<unsigned int> multiplicities = {n1, n2, n3, n4, n5};
+
+  const ReferenceCell reference_cell = fes.front()->reference_cell();
+  (void)reference_cell;
+  Assert(std::all_of(fes.begin(),
+                     fes.end(),
+                     [reference_cell](const FiniteElement<dim, spacedim> *fe) {
+                       return fe->reference_cell() == reference_cell;
+                     }),
+         ExcMessage("You cannot combine finite elements defined on "
+                    "different reference cells into a combined element "
+                    "such as an FESystem or FE_Enriched object."));
+
   initialize(fes, multiplicities);
 }
 
@@ -447,6 +495,17 @@ FESystem<dim, spacedim>::FESystem(
       FETools::Compositing::compute_nonzero_components(fes, multiplicities))
   , base_elements(count_nonzeros(multiplicities))
 {
+  const ReferenceCell reference_cell = fes.front()->reference_cell();
+  (void)reference_cell;
+  Assert(std::all_of(fes.begin(),
+                     fes.end(),
+                     [reference_cell](const FiniteElement<dim, spacedim> *fe) {
+                       return fe->reference_cell() == reference_cell;
+                     }),
+         ExcMessage("You cannot combine finite elements defined on "
+                    "different reference cells into a combined element "
+                    "such as an FESystem or FE_Enriched object."));
+
   initialize(fes, multiplicities);
 }
 

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.