]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Forgot one directory
authorMartin Kronbichler <kronbichler@lnm.mw.tum.de>
Fri, 4 Apr 2014 12:38:36 +0000 (12:38 +0000)
committerMartin Kronbichler <kronbichler@lnm.mw.tum.de>
Fri, 4 Apr 2014 12:38:36 +0000 (12:38 +0000)
git-svn-id: https://svn.dealii.org/trunk@32715 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/source/fe/fe.cc
deal.II/source/fe/fe_dgp.cc
deal.II/source/fe/fe_dgq.cc
deal.II/source/fe/fe_face.cc
deal.II/source/fe/fe_nedelec.cc
deal.II/source/fe/fe_q_base.cc
deal.II/source/fe/fe_q_dg0.cc
deal.II/source/fe/fe_q_hierarchical.cc
deal.II/source/fe/fe_raviart_thomas.cc
deal.II/source/fe/fe_system.cc

index 8237022f8ab76c8d9395ce0ad03635e11c2ba39b..7e9d79bf4d78a9a96e9f34bdb7148e5431937d9d 100644 (file)
@@ -1104,11 +1104,13 @@ FiniteElement<dim,spacedim>::has_support_on_face (
 
 
 template <int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FiniteElement<dim,spacedim>::get_constant_modes () const
 {
   Assert (false, ExcNotImplemented());
-  return Table<2,bool>(this->n_components(), this->dofs_per_cell);
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (Table<2,bool>(this->n_components(), this->dofs_per_cell),
+     std::vector<unsigned int>(this->n_components()));
 }
 
 
index ca52e4f1498728f6baf00bdb31592bbd2d42bb96..daa2b51d3a30f1a30f4359a1b90392113709a361 100644 (file)
@@ -238,12 +238,13 @@ FE_DGP<dim,spacedim>::has_support_on_face (const unsigned int,
 
 
 template <int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_DGP<dim,spacedim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
   constant_modes(0,0) = true;
-  return constant_modes;
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1, 0));
 }
 
 
index 9f8a69ce29249d6508747dff16c4c3e0ecb9d6d2..8fe34b6c6028adbc68802c063d8495bf3ee56dd6 100644 (file)
@@ -765,13 +765,13 @@ FE_DGQ<dim, spacedim>::has_support_on_face (const unsigned int shape_index,
 
 
 template <int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_DGQ<dim,spacedim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
-  for (unsigned int i=0; i<this->dofs_per_cell; ++i)
-    constant_modes(0,i) = true;
-  return constant_modes;
+  constant_modes.fill(true);
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1, 0));
 }
 
 
index 9d62ff19d54edb7b79c31de16557adc957b70565..3a210bd849c79128c4d3206c471350c309a9a8d2 100644 (file)
@@ -289,13 +289,14 @@ compare_for_face_domination (const FiniteElement<dim,spacedim> &fe_other) const
 
 
 template <int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_FaceQ<dim,spacedim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
   for (unsigned int i=0; i<this->dofs_per_cell; ++i)
     constant_modes(0,i) = true;
-  return constant_modes;
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1, 0));
 }
 
 
@@ -416,13 +417,14 @@ compare_for_face_domination (const FiniteElement<1,spacedim> &fe_other) const
 
 
 template <int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_FaceQ<1,spacedim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
   for (unsigned int i=0; i<this->dofs_per_cell; ++i)
     constant_modes(0,i) = true;
-  return constant_modes;
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1,0));
 }
 
 
@@ -780,13 +782,14 @@ get_subface_interpolation_matrix (const FiniteElement<dim,spacedim> &x_source_fe
 
 
 template <int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_FaceP<dim,spacedim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
   for (unsigned int face=0; face<GeometryInfo<dim>::faces_per_cell; ++face)
     constant_modes(0, face*this->dofs_per_face) = true;
-  return constant_modes;
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1, 0));
 }
 
 
index 29c15ced9494fb2366256934d88cc680e904a8da..40c14953f47389d6088f9667bd607d870755c1ba 100644 (file)
@@ -5466,14 +5466,18 @@ const
 
 
 template <int dim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_Nedelec<dim>::get_constant_modes() const
 {
   Table<2,bool> constant_modes(dim, this->dofs_per_cell);
   for (unsigned int d=0; d<dim; ++d)
     for (unsigned int i=0; i<this->dofs_per_cell; ++i)
       constant_modes(d,i) = true;
-  return constant_modes;
+  std::vector<unsigned int> components;
+  for (unsigned int d=0; d<dim; ++d)
+    components.push_back(d);
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, components);
 }
 
 
index 72122120631e85aa2910e774727a7d96eb826876..0e9b94ec33ada7d20a246b532e1302d1266c6e0e 100644 (file)
@@ -1495,14 +1495,15 @@ FE_Q_Base<POLY,dim,spacedim>::has_support_on_face (const unsigned int shape_inde
 
 
 template <typename POLY, int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_Q_Base<POLY,dim,spacedim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
-  // leave out last component
-  for (unsigned int i=0; i<Utilities::fixed_power<dim>(this->degree+1); ++i)
-    constant_modes(0, i) = true;
-  return constant_modes;
+  // FE_Q_DG0 should not use this function...
+  AssertDimension(this->dofs_per_cell, Utilities::fixed_power<dim>(this->degree+1));
+  constant_modes.fill(true);
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1, 0));
 }
 
 
index 8ecc7df8656cbf6afbd5f34b8d08d57c709dafe0..99ba0e946bae811dcae52a3586f7e37a393f2ecc 100644 (file)
@@ -307,6 +307,26 @@ FE_Q_DG0<dim,spacedim>::has_support_on_face (const unsigned int shape_index,
 }
 
 
+
+template <int dim, int spacedim>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
+FE_Q_DG0<dim,spacedim>::get_constant_modes () const
+{
+  Table<2,bool> constant_modes(2, this->dofs_per_cell);
+
+  // 1 represented by FE_Q part
+  for (unsigned int i=0; i<this->dofs_per_cell-1; ++i)
+    constant_modes(0, i) = true;
+
+  // 1 represented by DG0 part
+  constant_modes(1, this->dofs_per_cell-1) = true;
+
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int> (2, 0));
+}
+
+
+
 // explicit instantiations
 #include "fe_q_dg0.inst"
 
index b1800b63111645ae1307eb5ca180cdd470b5f64c..8d2d5bf0c6e1973b07fbb70011aebba9f3efbd21 100644 (file)
@@ -1862,7 +1862,7 @@ FE_Q_Hierarchical<dim>::get_embedding_dofs (const unsigned int sub_degree) const
 
 
 template <int dim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_Q_Hierarchical<dim>::get_constant_modes () const
 {
   Table<2,bool> constant_modes(1, this->dofs_per_cell);
@@ -1870,7 +1870,8 @@ FE_Q_Hierarchical<dim>::get_constant_modes () const
     constant_modes(0,i) = true;
   for (unsigned int i=GeometryInfo<dim>::vertices_per_cell; i<this->dofs_per_cell; ++i)
     constant_modes(0,i) = false;
-  return constant_modes;
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, std::vector<unsigned int>(1, 0));
 }
 
 
index 22208bae951905cd607824198c15cf99c6d34e6f..c799221bc71e00566001415ba49acaa4bcdc5835 100644 (file)
@@ -404,14 +404,18 @@ FE_RaviartThomas<dim>::get_dpo_vector (const unsigned int deg)
 
 
 template <int dim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FE_RaviartThomas<dim>::get_constant_modes() const
 {
   Table<2,bool> constant_modes(dim, this->dofs_per_cell);
   for (unsigned int d=0; d<dim; ++d)
     for (unsigned int i=0; i<this->dofs_per_cell; ++i)
       constant_modes(d,i) = true;
-  return constant_modes;
+  std::vector<unsigned int> components;
+  for (unsigned int d=0; d<dim; ++d)
+    components.push_back(d);
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >
+    (constant_modes, components);
 }
 
 
index 24cc2213c5b1afb4a434edda503ea4ce32b1e121..bf072c4a01a7881c2d1a1daef06a074d3cb069a1 100644 (file)
@@ -2983,28 +2983,54 @@ FESystem<dim,spacedim>::unit_face_support_point (const unsigned int index) const
 
 
 template <int dim, int spacedim>
-Table<2,bool>
+std::pair<Table<2,bool>, std::vector<unsigned int> >
 FESystem<dim,spacedim>::get_constant_modes () const
 {
+  // Note that this->n_components() is actually only an estimate of how many
+  // constant modes we will need. There might be more than one such mode
+  // (e.g. FE_Q_DG0).
   Table<2,bool> constant_modes(this->n_components(), this->dofs_per_cell);
-  unsigned int comp=0;
+  std::vector<unsigned int> components;
   for (unsigned int i=0; i<base_elements.size(); ++i)
     {
-      Table<2,bool> base_table = base_elements[i].first->get_constant_modes();
-      const unsigned int n_base_components = base_elements[i].first->n_components();
+      std::pair<Table<2,bool>, std::vector<unsigned int> >
+        base_table = base_elements[i].first->get_constant_modes();
+      AssertDimension(base_table.first.n_rows(), base_table.second.size());
+      const unsigned int element_multiplicity = this->element_multiplicity(i);
+
+      // there might be more than one constant mode for some scalar elements,
+      // so make sure the table actually fits: Create a new table with more
+      // rows
+      const unsigned int comp = components.size();
+      if (constant_modes.n_rows() < comp+base_table.first.n_rows()*element_multiplicity)
+        {
+          Table<2,bool> new_constant_modes(comp+base_table.first.n_rows()*
+                                           element_multiplicity,
+                                           constant_modes.n_cols());
+          std::copy(&constant_modes(0,0), &constant_modes(0,0)+this->dofs_per_cell*comp,
+                    &new_constant_modes(0,0));
+          constant_modes.swap(new_constant_modes);
+        }
+
+      // next, fill the constant modes from the individual components as well
+      // as the component numbers corresponding to the constant mode rows
       for (unsigned int k=0; k<this->dofs_per_cell; ++k)
         {
           std::pair<std::pair<unsigned int,unsigned int>, unsigned int> ind
             = this->system_to_base_index(k);
           if (ind.first.first == i)
-            for (unsigned int c=0; c<base_table.n_rows(); ++c)
-              constant_modes(comp+ind.first.second*n_base_components+c,k)
-                = base_table(c,ind.second);
+            for (unsigned int c=0; c<base_table.first.n_rows(); ++c)
+              constant_modes(comp+ind.first.second*base_table.first.n_rows()+c,k)
+                = base_table.first(c,ind.second);
         }
-      comp += n_base_components * base_elements[i].second;
+      for (unsigned int r=0; r<element_multiplicity; ++r)
+        for (unsigned int c=0; c<base_table.second.size(); ++c)
+          components.push_back(comp+r*this->base_elements[i].first->n_components()
+                               +base_table.second[c]);
     }
-  AssertDimension(comp, this->n_components());
-  return constant_modes;
+  AssertDimension(components.size(), constant_modes.n_rows());
+  return std::pair<Table<2,bool>, std::vector<unsigned int> >(constant_modes,
+                                                              components);
 }
 
 

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.