]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
Implement hp vertex/line/quad identities for FESystem
authorbangerth <bangerth@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 11 Aug 2006 11:29:16 +0000 (11:29 +0000)
committerbangerth <bangerth@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 11 Aug 2006 11:29:16 +0000 (11:29 +0000)
git-svn-id: https://svn.dealii.org/trunk@13651 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/include/fe/fe_system.h
deal.II/deal.II/source/fe/fe_system.cc
tests/hp/hp_line_dof_identities_q_system.cc [new file with mode: 0644]
tests/hp/hp_line_dof_identities_q_system/cmp/generic [new file with mode: 0644]
tests/hp/hp_quad_dof_identities_q_system.cc [new file with mode: 0644]
tests/hp/hp_quad_dof_identities_q_system/cmp/generic [new file with mode: 0644]
tests/hp/hp_vertex_dof_identities_q_system.cc [new file with mode: 0644]
tests/hp/hp_vertex_dof_identities_q_system/cmp/generic [new file with mode: 0644]

index 37b0248776c083ba88bba8a6f85d4655f6524737..93c6edef0be2096a91b342e793bab86002c538cf 100644 (file)
@@ -66,7 +66,7 @@
  *
  * @ingroup febase fe
  * 
- * @author Wolfgang Bangerth, Guido Kanschat, 1999, 2002, 2003, partial reimplementation Ralf Hartmann 2001.
+ * @author Wolfgang Bangerth, Guido Kanschat, 1999, 2002, 2003, 2006, partial reimplementation Ralf Hartmann 2001.
  */
 template <int dim>
 class FESystem : public FiniteElement<dim>
@@ -93,7 +93,8 @@ class FESystem : public FiniteElement<dim>
                                      * class needs to be of the same dimension
                                      * as is this object.
                                      */
-    FESystem (const FiniteElement<dim> &fe, const unsigned int n_elements);
+    FESystem (const FiniteElement<dim> &fe,
+             const unsigned int n_elements);
 
                                     /** 
                                      * Constructor for mixed
@@ -389,6 +390,86 @@ class FESystem : public FiniteElement<dim>
     virtual
     Point<dim-1>
     unit_face_support_point (const unsigned int index) const;
+
+                                    /**
+                                     * @name Functions to support hp 
+                                     * @{
+                                     */
+    
+                                     /**
+                                      * Return whether this element
+                                      * implements its hanging node
+                                      * constraints in the new way,
+                                     * which has to be used to make
+                                     * elements "hp compatible".
+                                      *
+                                     * This function returns @p true iff all
+                                     * its base elements return @p true for
+                                     * this function.
+                                      */
+    virtual bool hp_constraints_are_implemented () const;
+    
+                                    /**
+                                     * If, on a vertex, several
+                                     * finite elements are active,
+                                     * the hp code first assigns the
+                                     * degrees of freedom of each of
+                                     * these FEs different global
+                                     * indices. It then calls this
+                                     * function to find out which of
+                                     * them should get identical
+                                     * values, and consequently can
+                                     * receive the same global DoF
+                                     * index. This function therefore
+                                     * returns a list of identities
+                                     * between DoFs of the present
+                                     * finite element object with the
+                                     * DoFs of @p fe_other, which is
+                                     * a reference to a finite
+                                     * element object representing
+                                     * one of the other finite
+                                     * elements active on this
+                                     * particular vertex. The
+                                     * function computes which of the
+                                     * degrees of freedom of the two
+                                     * finite element objects are
+                                     * equivalent, and returns a list
+                                     * of pairs of global dof indices
+                                     * in @p identities. The first
+                                     * index of each pair denotes one
+                                     * of the vertex dofs of the
+                                     * present element, whereas the
+                                     * second is the corresponding
+                                     * index of the other finite
+                                     * element.
+                                     */
+    virtual
+    std::vector<std::pair<unsigned int, unsigned int> >
+    hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+                                    /**
+                                     * Same as
+                                     * hp_vertex_dof_indices(),
+                                     * except that the function
+                                     * treats degrees of freedom on
+                                     * lines.
+                                     */
+    virtual
+    std::vector<std::pair<unsigned int, unsigned int> >
+    hp_line_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+                                    /**
+                                     * Same as
+                                     * hp_vertex_dof_indices(),
+                                     * except that the function
+                                     * treats degrees of freedom on
+                                     * quads.
+                                     */
+    virtual
+    std::vector<std::pair<unsigned int, unsigned int> >
+    hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const;
+    
+                                    //@}
     
                                     /**
                                      * Determine an estimate for the
index 9a85175dd1945280fcf6545668ccac23569cbda6..46b039ca19bfd4e720f36f82b16ce73ad8b06fae 100644 (file)
@@ -1846,6 +1846,374 @@ initialize_unit_face_support_points ()
 
 
 
+template <int dim>
+bool
+FESystem<dim>::
+hp_constraints_are_implemented () const
+{
+  for (unsigned int b=0; b<n_base_elements(); ++b)
+    if (base_element(b).hp_constraints_are_implemented() == false)
+      return false;
+
+  return true;
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FESystem<dim>::hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+                                  // since dofs on each subobject (vertex,
+                                  // line, ...) are ordered such that first
+                                  // come all from the first base element all
+                                  // multiplicities, then second base element
+                                  // all multiplicities, etc., we simply have
+                                  // to stack all the identities after each
+                                  // other
+                                  //
+                                  // the problem is that we have to work with
+                                  // two FEs (this and fe_other). only deal
+                                  // with the case that both are FESystems
+                                  // and that they both have the same number
+                                  // of bases (counting multiplicity) each of
+                                  // which match in their number of
+                                  // components. this covers
+                                  // FESystem(FE_Q(p),1,FE_Q(q),2) vs
+                                  // FESystem(FE_Q(r),2,FE_Q(s),1), but not
+                                  // FESystem(FE_Q(p),1,FE_Q(q),2) vs
+                                  // FESystem(FESystem(FE_Q(r),2),1,FE_Q(s),1)
+  if (const FESystem<dim> *fe_other_system
+      = dynamic_cast<const FESystem<dim>*>(&fe_other))
+    {
+                                      // loop over all the base elements of
+                                      // this and the other element, counting
+                                      // their multiplicities
+      unsigned int base_index       = 0,
+                  base_index_other = 0;
+      unsigned int multiplicity       = 0,
+                  multiplicity_other = 0;
+
+                                      // we also need to keep track of the
+                                      // number of dofs already treated for
+                                      // each of the elements
+      unsigned int dof_offset       = 0,
+                  dof_offset_other = 0;
+
+      std::vector<std::pair<unsigned int, unsigned int> > identities;
+      
+      while (true)
+       {
+         const FiniteElement<dim>
+           &base       = base_element(base_index),
+           &base_other = fe_other_system->base_element(base_index_other);
+
+         Assert (base.n_components() == base_other.n_components(),
+                 ExcNotImplemented());
+
+                                          // now translate the identities
+                                          // returned by the base elements to
+                                          // the indices of this system
+                                          // element
+         const std::vector<std::pair<unsigned int, unsigned int> >
+           base_identities = base.hp_vertex_dof_identities (base_other);
+
+         for (unsigned int i=0; i<base_identities.size(); ++i)
+           identities.push_back
+             (std::make_pair (base_identities[i].first + dof_offset,
+                              base_identities[i].second + dof_offset_other));
+
+                                          // record the dofs treated above as
+                                          // already taken care of
+         dof_offset       += base.dofs_per_vertex;
+         dof_offset_other += base_other.dofs_per_vertex;
+         
+                                          // advance to the next base element
+                                          // for this and the other
+                                          // fe_system; see if we can simply
+                                          // advance the multiplicity by one,
+                                          // or if have to move on to the
+                                          // next base element
+         ++multiplicity;
+         if (multiplicity == element_multiplicity(base_index))
+           {
+             multiplicity = 0;
+             ++base_index;
+           }
+         ++multiplicity_other;
+         if (multiplicity_other ==
+             fe_other_system->element_multiplicity(base_index_other))
+           {
+             multiplicity_other = 0;
+             ++base_index_other;
+           }
+
+                                          // see if we have reached the end
+                                          // of the present element. if so,
+                                          // we should have reached the end
+                                          // of the other one as well
+         if (base_index == n_base_elements())
+           {
+             Assert (base_index_other == fe_other_system->n_base_elements(),
+                     ExcInternalError());
+             break;
+           }
+
+                                          // if we haven't reached the end of
+                                          // this element, we shouldn't have
+                                          // reached the end of the other one
+                                          // either
+         Assert (base_index_other != fe_other_system->n_base_elements(),
+                 ExcInternalError());
+       }
+
+      return identities;
+    }
+  else
+    {
+      Assert (false, ExcNotImplemented());
+      return std::vector<std::pair<unsigned int, unsigned int> >();
+    }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FESystem<dim>::hp_line_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+                                  // since dofs on each subobject (vertex,
+                                  // line, ...) are ordered such that first
+                                  // come all from the first base element all
+                                  // multiplicities, then second base element
+                                  // all multiplicities, etc., we simply have
+                                  // to stack all the identities after each
+                                  // other
+                                  //
+                                  // the problem is that we have to work with
+                                  // two FEs (this and fe_other). only deal
+                                  // with the case that both are FESystems
+                                  // and that they both have the same number
+                                  // of bases (counting multiplicity) each of
+                                  // which match in their number of
+                                  // components. this covers
+                                  // FESystem(FE_Q(p),1,FE_Q(q),2) vs
+                                  // FESystem(FE_Q(r),2,FE_Q(s),1), but not
+                                  // FESystem(FE_Q(p),1,FE_Q(q),2) vs
+                                  // FESystem(FESystem(FE_Q(r),2),1,FE_Q(s),1)
+  if (const FESystem<dim> *fe_other_system
+      = dynamic_cast<const FESystem<dim>*>(&fe_other))
+    {
+                                      // loop over all the base elements of
+                                      // this and the other element, counting
+                                      // their multiplicities
+      unsigned int base_index       = 0,
+                  base_index_other = 0;
+      unsigned int multiplicity       = 0,
+                  multiplicity_other = 0;
+
+                                      // we also need to keep track of the
+                                      // number of dofs already treated for
+                                      // each of the elements
+      unsigned int dof_offset       = 0,
+                  dof_offset_other = 0;
+
+      std::vector<std::pair<unsigned int, unsigned int> > identities;
+      
+      while (true)
+       {
+         const FiniteElement<dim>
+           &base       = base_element(base_index),
+           &base_other = fe_other_system->base_element(base_index_other);
+
+         Assert (base.n_components() == base_other.n_components(),
+                 ExcNotImplemented());
+
+                                          // now translate the identities
+                                          // returned by the base elements to
+                                          // the indices of this system
+                                          // element
+         const std::vector<std::pair<unsigned int, unsigned int> >
+           base_identities = base.hp_line_dof_identities (base_other);
+
+         for (unsigned int i=0; i<base_identities.size(); ++i)
+           identities.push_back
+             (std::make_pair (base_identities[i].first + dof_offset,
+                              base_identities[i].second + dof_offset_other));
+
+                                          // record the dofs treated above as
+                                          // already taken care of
+         dof_offset       += base.dofs_per_line;
+         dof_offset_other += base_other.dofs_per_line;
+         
+                                          // advance to the next base element
+                                          // for this and the other
+                                          // fe_system; see if we can simply
+                                          // advance the multiplicity by one,
+                                          // or if have to move on to the
+                                          // next base element
+         ++multiplicity;
+         if (multiplicity == element_multiplicity(base_index))
+           {
+             multiplicity = 0;
+             ++base_index;
+           }
+         ++multiplicity_other;
+         if (multiplicity_other ==
+             fe_other_system->element_multiplicity(base_index_other))
+           {
+             multiplicity_other = 0;
+             ++base_index_other;
+           }
+
+                                          // see if we have reached the end
+                                          // of the present element. if so,
+                                          // we should have reached the end
+                                          // of the other one as well
+         if (base_index == n_base_elements())
+           {
+             Assert (base_index_other == fe_other_system->n_base_elements(),
+                     ExcInternalError());
+             break;
+           }
+
+                                          // if we haven't reached the end of
+                                          // this element, we shouldn't have
+                                          // reached the end of the other one
+                                          // either
+         Assert (base_index_other != fe_other_system->n_base_elements(),
+                 ExcInternalError());
+       }
+
+      return identities;
+    }
+  else
+    {
+      Assert (false, ExcNotImplemented());
+      return std::vector<std::pair<unsigned int, unsigned int> >();
+    }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FESystem<dim>::hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+                                  // since dofs on each subobject (vertex,
+                                  // line, ...) are ordered such that first
+                                  // come all from the first base element all
+                                  // multiplicities, then second base element
+                                  // all multiplicities, etc., we simply have
+                                  // to stack all the identities after each
+                                  // other
+                                  //
+                                  // the problem is that we have to work with
+                                  // two FEs (this and fe_other). only deal
+                                  // with the case that both are FESystems
+                                  // and that they both have the same number
+                                  // of bases (counting multiplicity) each of
+                                  // which match in their number of
+                                  // components. this covers
+                                  // FESystem(FE_Q(p),1,FE_Q(q),2) vs
+                                  // FESystem(FE_Q(r),2,FE_Q(s),1), but not
+                                  // FESystem(FE_Q(p),1,FE_Q(q),2) vs
+                                  // FESystem(FESystem(FE_Q(r),2),1,FE_Q(s),1)
+  if (const FESystem<dim> *fe_other_system
+      = dynamic_cast<const FESystem<dim>*>(&fe_other))
+    {
+                                      // loop over all the base elements of
+                                      // this and the other element, counting
+                                      // their multiplicities
+      unsigned int base_index       = 0,
+                  base_index_other = 0;
+      unsigned int multiplicity       = 0,
+                  multiplicity_other = 0;
+
+                                      // we also need to keep track of the
+                                      // number of dofs already treated for
+                                      // each of the elements
+      unsigned int dof_offset       = 0,
+                  dof_offset_other = 0;
+
+      std::vector<std::pair<unsigned int, unsigned int> > identities;
+      
+      while (true)
+       {
+         const FiniteElement<dim>
+           &base       = base_element(base_index),
+           &base_other = fe_other_system->base_element(base_index_other);
+
+         Assert (base.n_components() == base_other.n_components(),
+                 ExcNotImplemented());
+
+                                          // now translate the identities
+                                          // returned by the base elements to
+                                          // the indices of this system
+                                          // element
+         const std::vector<std::pair<unsigned int, unsigned int> >
+           base_identities = base.hp_quad_dof_identities (base_other);
+
+         for (unsigned int i=0; i<base_identities.size(); ++i)
+           identities.push_back
+             (std::make_pair (base_identities[i].first + dof_offset,
+                              base_identities[i].second + dof_offset_other));
+
+                                          // record the dofs treated above as
+                                          // already taken care of
+         dof_offset       += base.dofs_per_quad;
+         dof_offset_other += base_other.dofs_per_quad;
+         
+                                          // advance to the next base element
+                                          // for this and the other
+                                          // fe_system; see if we can simply
+                                          // advance the multiplicity by one,
+                                          // or if have to move on to the
+                                          // next base element
+         ++multiplicity;
+         if (multiplicity == element_multiplicity(base_index))
+           {
+             multiplicity = 0;
+             ++base_index;
+           }
+         ++multiplicity_other;
+         if (multiplicity_other ==
+             fe_other_system->element_multiplicity(base_index_other))
+           {
+             multiplicity_other = 0;
+             ++base_index_other;
+           }
+
+                                          // see if we have reached the end
+                                          // of the present element. if so,
+                                          // we should have reached the end
+                                          // of the other one as well
+         if (base_index == n_base_elements())
+           {
+             Assert (base_index_other == fe_other_system->n_base_elements(),
+                     ExcInternalError());
+             break;
+           }
+
+                                          // if we haven't reached the end of
+                                          // this element, we shouldn't have
+                                          // reached the end of the other one
+                                          // either
+         Assert (base_index_other != fe_other_system->n_base_elements(),
+                 ExcInternalError());
+       }
+
+      return identities;
+    }
+  else
+    {
+      Assert (false, ExcNotImplemented());
+      return std::vector<std::pair<unsigned int, unsigned int> >();
+    }
+}
+
+
+
 template <int dim>
 FiniteElementData<dim>
 FESystem<dim>::multiply_dof_numbers (const FiniteElementData<dim> &fe1,
diff --git a/tests/hp/hp_line_dof_identities_q_system.cc b/tests/hp/hp_line_dof_identities_q_system.cc
new file mode 100644 (file)
index 0000000..e69bbc6
--- /dev/null
@@ -0,0 +1,75 @@
+//----------------------------  hp_line_dof_identities_q_system.cc  ---------------------------
+//    $Id: hp_line_dof_identities_q_system.cc 12464 2006-02-23 01:13:17Z wolf $
+//    Version: $Name$ 
+//
+//    Copyright (C) 2005, 2006 by the deal.II authors
+//
+//    This file is subject to QPL and may not be  distributed
+//    without copyright and license information. Please refer
+//    to the file deal.II/doc/license.html for the  text  and
+//    further information on this license.
+//
+//----------------------------  hp_line_dof_identities_q_system.cc  ---------------------------
+
+
+// check FESystem(FE_Q)::hp_line_dof_identities
+
+
+#include <base/logstream.h>
+#include <fe/fe_collection.h>
+#include <fe/fe_q.h>
+#include <fe/fe_system.h>
+
+#include <fstream>
+
+
+template <int dim>
+void test ()
+{
+  hp::FECollection<dim> fe_collection;
+  for (unsigned int i=1; i<8-dim; ++i)
+    fe_collection.push_back (FESystem<dim>(FE_Q<dim>(i),3));
+
+  for (unsigned int i=0; i<fe_collection.size(); ++i)
+    for (unsigned int j=0; j<fe_collection.size(); ++j)
+      {
+       const std::vector<std::pair<unsigned int, unsigned int> >
+         identities = fe_collection[i].hp_line_dof_identities (fe_collection[j]);
+
+       deallog << "Identities for "
+               << fe_collection[i].get_name() << " and "
+               << fe_collection[j].get_name() << ": "
+               << identities.size()
+               << std::endl;
+       
+       for (unsigned int k=0; k<identities.size(); ++k)
+         {
+           Assert (identities[k].first < fe_collection[i].dofs_per_line,
+                   ExcInternalError());
+           Assert (identities[k].second < fe_collection[j].dofs_per_line,
+                   ExcInternalError());
+           
+           deallog << identities[k].first << ' '
+                   << identities[k].second
+                   << std::endl;
+         }
+      }
+}
+
+
+
+int main ()
+{
+  std::ofstream logfile("hp_line_dof_identities_q_system/output");
+  logfile.precision(2);
+  
+  deallog.attach(logfile);
+  deallog.depth_console(0);
+  deallog.threshold_double(1.e-10);
+  
+  test<1> ();
+  test<2> ();
+  test<3> ();
+  
+  deallog << "OK" << std::endl;
+}
diff --git a/tests/hp/hp_line_dof_identities_q_system/cmp/generic b/tests/hp/hp_line_dof_identities_q_system/cmp/generic
new file mode 100644 (file)
index 0000000..f3a252b
--- /dev/null
@@ -0,0 +1,214 @@
+
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(1)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(2)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(3)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(4)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(5)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(6)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(1)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(3)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 1
+DEAL::1 4
+DEAL::2 7
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(5)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 2
+DEAL::1 7
+DEAL::2 12
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(1)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(2)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(3)^3]: 6
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(4)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(5)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(6)^3]: 6
+DEAL::0 1
+DEAL::1 3
+DEAL::2 6
+DEAL::3 8
+DEAL::4 11
+DEAL::5 13
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(1)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::1 0
+DEAL::4 1
+DEAL::7 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(3)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(4)^3]: 9
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(5)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::1 2
+DEAL::4 7
+DEAL::7 12
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(1)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(2)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(3)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(4)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(5)^3]: 12
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(6)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(1)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::2 0
+DEAL::7 1
+DEAL::12 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(3)^3]: 6
+DEAL::1 0
+DEAL::3 1
+DEAL::6 2
+DEAL::8 3
+DEAL::11 4
+DEAL::13 5
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::2 1
+DEAL::7 4
+DEAL::12 7
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(5)^3]: 0
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(6)^3]: 15
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::12 12
+DEAL::13 13
+DEAL::14 14
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(2)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(4)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 1
+DEAL::1 4
+DEAL::2 7
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(2)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(3)^3]: 6
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(4)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::1 0
+DEAL::4 1
+DEAL::7 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(4)^3]: 9
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(2)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(4)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(5)^3]: 12
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(2)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(3)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(4)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(3)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(4)^3]: 3
+DEAL::0 1
+DEAL::1 4
+DEAL::2 7
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(2)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(3)^3]: 6
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(4)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::1 0
+DEAL::4 1
+DEAL::7 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(3)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(4)^3]: 9
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::OK
diff --git a/tests/hp/hp_quad_dof_identities_q_system.cc b/tests/hp/hp_quad_dof_identities_q_system.cc
new file mode 100644 (file)
index 0000000..6a4a152
--- /dev/null
@@ -0,0 +1,74 @@
+//----------------------------  hp_quad_dof_identities_q_system.cc  ---------------------------
+//    $Id: hp_quad_dof_identities_q_system.cc 12464 2006-02-23 01:13:17Z wolf $
+//    Version: $Name$ 
+//
+//    Copyright (C) 2005, 2006 by the deal.II authors
+//
+//    This file is subject to QPL and may not be  distributed
+//    without copyright and license information. Please refer
+//    to the file deal.II/doc/license.html for the  text  and
+//    further information on this license.
+//
+//----------------------------  hp_quad_dof_identities_q_system.cc  ---------------------------
+
+
+// check FESystem(FE_Q)::hp_quad_dof_identities
+
+
+#include <base/logstream.h>
+#include <fe/fe_collection.h>
+#include <fe/fe_q.h>
+#include <fe/fe_system.h>
+
+#include <fstream>
+
+
+template <int dim>
+void test ()
+{
+  hp::FECollection<dim> fe_collection;
+  for (unsigned int i=1; i<8-dim; ++i)
+    fe_collection.push_back (FESystem<dim>(FE_Q<dim>(i),3));
+
+  for (unsigned int i=0; i<fe_collection.size(); ++i)
+    for (unsigned int j=0; j<fe_collection.size(); ++j)
+      {
+       const std::vector<std::pair<unsigned int, unsigned int> >
+         identities = fe_collection[i].hp_quad_dof_identities (fe_collection[j]);
+
+       deallog << "Identities for "
+               << fe_collection[i].get_name() << " and "
+               << fe_collection[j].get_name() << ": "
+               << identities.size()
+               << std::endl;
+       
+       for (unsigned int k=0; k<identities.size(); ++k)
+         {
+           Assert (identities[k].first < fe_collection[i].dofs_per_quad,
+                   ExcInternalError());
+           Assert (identities[k].second < fe_collection[j].dofs_per_quad,
+                   ExcInternalError());
+           
+           deallog << identities[k].first << ' '
+                   << identities[k].second
+                   << std::endl;
+         }
+      }
+}
+
+
+
+int main ()
+{
+  std::ofstream logfile("hp_quad_dof_identities_q_system/output");
+  logfile.precision(2);
+  
+  deallog.attach(logfile);
+  deallog.depth_console(0);
+  deallog.threshold_double(1.e-10);
+  
+  test<2> ();
+  test<3> ();
+  
+  deallog << "OK" << std::endl;
+}
diff --git a/tests/hp/hp_quad_dof_identities_q_system/cmp/generic b/tests/hp/hp_quad_dof_identities_q_system/cmp/generic
new file mode 100644 (file)
index 0000000..a345f27
--- /dev/null
@@ -0,0 +1,187 @@
+
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(2)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(4)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 4
+DEAL::1 13
+DEAL::2 22
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(2)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(3)^3]: 12
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(4)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::4 0
+DEAL::13 1
+DEAL::22 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(4)^3]: 27
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::12 12
+DEAL::13 13
+DEAL::14 14
+DEAL::15 15
+DEAL::16 16
+DEAL::17 17
+DEAL::18 18
+DEAL::19 19
+DEAL::20 20
+DEAL::21 21
+DEAL::22 22
+DEAL::23 23
+DEAL::24 24
+DEAL::25 25
+DEAL::26 26
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(5)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(1)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(2)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(3)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(4)^3]: 0
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(5)^3]: 48
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::12 12
+DEAL::13 13
+DEAL::14 14
+DEAL::15 15
+DEAL::16 16
+DEAL::17 17
+DEAL::18 18
+DEAL::19 19
+DEAL::20 20
+DEAL::21 21
+DEAL::22 22
+DEAL::23 23
+DEAL::24 24
+DEAL::25 25
+DEAL::26 26
+DEAL::27 27
+DEAL::28 28
+DEAL::29 29
+DEAL::30 30
+DEAL::31 31
+DEAL::32 32
+DEAL::33 33
+DEAL::34 34
+DEAL::35 35
+DEAL::36 36
+DEAL::37 37
+DEAL::38 38
+DEAL::39 39
+DEAL::40 40
+DEAL::41 41
+DEAL::42 42
+DEAL::43 43
+DEAL::44 44
+DEAL::45 45
+DEAL::46 46
+DEAL::47 47
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(2)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(3)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(4)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(3)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(4)^3]: 3
+DEAL::0 4
+DEAL::1 13
+DEAL::2 22
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(2)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(3)^3]: 12
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(4)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(1)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::4 0
+DEAL::13 1
+DEAL::22 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(3)^3]: 0
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(4)^3]: 27
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::3 3
+DEAL::4 4
+DEAL::5 5
+DEAL::6 6
+DEAL::7 7
+DEAL::8 8
+DEAL::9 9
+DEAL::10 10
+DEAL::11 11
+DEAL::12 12
+DEAL::13 13
+DEAL::14 14
+DEAL::15 15
+DEAL::16 16
+DEAL::17 17
+DEAL::18 18
+DEAL::19 19
+DEAL::20 20
+DEAL::21 21
+DEAL::22 22
+DEAL::23 23
+DEAL::24 24
+DEAL::25 25
+DEAL::26 26
+DEAL::OK
diff --git a/tests/hp/hp_vertex_dof_identities_q_system.cc b/tests/hp/hp_vertex_dof_identities_q_system.cc
new file mode 100644 (file)
index 0000000..8568a46
--- /dev/null
@@ -0,0 +1,75 @@
+//----------------------------  hp_vertex_dof_identities_q_system.cc  ---------------------------
+//    $Id: hp_vertex_dof_identities_q_system.cc 12464 2006-02-23 01:13:17Z wolf $
+//    Version: $Name$ 
+//
+//    Copyright (C) 2005, 2006 by the deal.II authors
+//
+//    This file is subject to QPL and may not be  distributed
+//    without copyright and license information. Please refer
+//    to the file deal.II/doc/license.html for the  text  and
+//    further information on this license.
+//
+//----------------------------  hp_vertex_dof_identities_q_system.cc  ---------------------------
+
+
+// check FESystem(FE_Q)::hp_vertex_dof_identities
+
+
+#include <base/logstream.h>
+#include <fe/fe_collection.h>
+#include <fe/fe_q.h>
+#include <fe/fe_system.h>
+
+#include <fstream>
+
+
+template <int dim>
+void test ()
+{
+  hp::FECollection<dim> fe_collection;
+  for (unsigned int i=1; i<8-dim; ++i)
+    fe_collection.push_back (FESystem<dim>(FE_Q<dim>(i),3));
+
+  for (unsigned int i=0; i<fe_collection.size(); ++i)
+    for (unsigned int j=0; j<fe_collection.size(); ++j)
+      {
+       const std::vector<std::pair<unsigned int, unsigned int> >
+         identities = fe_collection[i].hp_vertex_dof_identities (fe_collection[j]);
+
+       deallog << "Identities for "
+               << fe_collection[i].get_name() << " and "
+               << fe_collection[j].get_name() << ": "
+               << identities.size()
+               << std::endl;
+       
+       for (unsigned int k=0; k<identities.size(); ++k)
+         {
+           Assert (identities[k].first < fe_collection[i].dofs_per_vertex,
+                   ExcInternalError());
+           Assert (identities[k].second < fe_collection[j].dofs_per_vertex,
+                   ExcInternalError());
+           
+           deallog << identities[k].first << ' '
+                   << identities[k].second
+                   << std::endl;
+         }
+      }
+}
+
+
+
+int main ()
+{
+  std::ofstream logfile("hp_vertex_dof_identities_q_system/output");
+  logfile.precision(2);
+  
+  deallog.attach(logfile);
+  deallog.depth_console(0);
+  deallog.threshold_double(1.e-10);
+  
+  test<1> ();
+  test<2> ();
+  test<3> ();
+  
+  deallog << "OK" << std::endl;
+}
diff --git a/tests/hp/hp_vertex_dof_identities_q_system/cmp/generic b/tests/hp/hp_vertex_dof_identities_q_system/cmp/generic
new file mode 100644 (file)
index 0000000..af0f7f6
--- /dev/null
@@ -0,0 +1,310 @@
+
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(1)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(2)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(3)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(4)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(5)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<1>[FE_Q<1>(6)^3] and FESystem<1>[FE_Q<1>(6)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(1)^3] and FESystem<2>[FE_Q<2>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(2)^3] and FESystem<2>[FE_Q<2>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(3)^3] and FESystem<2>[FE_Q<2>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(4)^3] and FESystem<2>[FE_Q<2>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<2>[FE_Q<2>(5)^3] and FESystem<2>[FE_Q<2>(5)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(1)^3] and FESystem<3>[FE_Q<3>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(2)^3] and FESystem<3>[FE_Q<3>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(3)^3] and FESystem<3>[FE_Q<3>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(1)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(2)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(3)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::Identities for FESystem<3>[FE_Q<3>(4)^3] and FESystem<3>[FE_Q<3>(4)^3]: 3
+DEAL::0 0
+DEAL::1 1
+DEAL::2 2
+DEAL::OK

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.