]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Assignment of DoF iterators from TriaIterator
authorGuido Kanschat <dr.guido.kanschat@gmail.com>
Thu, 25 Mar 2010 16:27:49 +0000 (16:27 +0000)
committerGuido Kanschat <dr.guido.kanschat@gmail.com>
Thu, 25 Mar 2010 16:27:49 +0000 (16:27 +0000)
git-svn-id: https://svn.dealii.org/trunk@20893 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/include/dofs/dof_accessor.h
deal.II/deal.II/include/dofs/dof_accessor.templates.h
deal.II/deal.II/include/grid/tria_accessor.h
deal.II/deal.II/include/grid/tria_accessor.templates.h
deal.II/deal.II/include/grid/tria_iterator.h
deal.II/deal.II/include/grid/tria_iterator.templates.h
deal.II/deal.II/source/grid/tria_accessor.cc
deal.II/doc/news/changes.h

index 36cacee7ed29264c3bd598834e5d46e3b6590c68..d5266997dc452d344e0d49d5e3c07c549b4fac95 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by the deal.II authors
+//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
@@ -280,6 +280,15 @@ class DoFAccessor : public internal::DoFAccessor::Inheritance<structdim, DH::dim
                                      */
     void copy_from (const DoFAccessor<structdim, DH> &a);
 
+                                    /**
+                                     * Copy operator used by the
+                                     * iterator class. Keeps the
+                                     * previously set dof handler,
+                                     * but sets the object
+                                     * coordinates of the TriaAccessor.
+                                     */
+    void copy_from (const TriaAccessorBase<structdim, DH::dimension, DH::space_dimension> &da);
+    
                                     /**
                                      *  @name Accessing sub-objects
                                      */
index 9c5ba69dbb502e2df78bddf4d75cfd2069ff90ea..9f10acedf59c87bf5cc3bdbc16475a941939af0a 100644 (file)
@@ -33,8 +33,8 @@ DEAL_II_NAMESPACE_OPEN
 
 
 template <int structdim, class DH>
-DoFAccessor<structdim,DH>::
-DoFAccessor ()
+inline
+DoFAccessor<structdim,DH>::DoFAccessor ()
 {
   Assert (false, ExcInvalidObject());
 }
@@ -43,11 +43,11 @@ DoFAccessor ()
 
 template <int structdim, class DH>
 inline
-DoFAccessor<structdim,DH>::
-DoFAccessor (const Triangulation<DH::dimension,DH::space_dimension> *tria,
-            const int                 level,
-            const int                 index,
-            const DH                 *dof_handler)
+DoFAccessor<structdim,DH>::DoFAccessor (
+  const Triangulation<DH::dimension,DH::space_dimension> *tria,
+  const int                 level,
+  const int                 index,
+  const DH                 *dof_handler)
                :
                internal::DoFAccessor::Inheritance<structdim,DH::dimension,
                                                    DH::space_dimension>::BaseClass (tria,
@@ -60,8 +60,7 @@ DoFAccessor (const Triangulation<DH::dimension,DH::space_dimension> *tria,
 
 template <int structdim, class DH>
 template <int structdim2, int dim2, int spacedim2>
-DoFAccessor<structdim,DH>::
-DoFAccessor (const InvalidAccessor<structdim2,dim2,spacedim2> &)
+DoFAccessor<structdim,DH>::DoFAccessor (const InvalidAccessor<structdim2,dim2,spacedim2> &)
 {
   Assert (false, ExcInvalidObject());
 }
@@ -70,8 +69,8 @@ DoFAccessor (const InvalidAccessor<structdim2,dim2,spacedim2> &)
 
 template <int structdim, class DH>
 template <int dim2, class DH2>
-DoFAccessor<structdim,DH>::
-DoFAccessor (const DoFAccessor<dim2, DH2> &)
+inline
+DoFAccessor<structdim,DH>::DoFAccessor (const DoFAccessor<dim2, DH2> &)
 {
   Assert (false, ExcInvalidObject());
 }
@@ -98,6 +97,8 @@ DoFAccessor<structdim,DH>::get_dof_handler () const
 }
 
 
+//TODO: This seems to set only the DH, not the other data.
+
 template <int structdim, class DH>
 inline
 DoFAccessor<structdim,DH> &
@@ -109,6 +110,18 @@ DoFAccessor<structdim,DH>::operator = (const DoFAccessor<structdim,DH> &da)
 
 
 
+template <int structdim, class DH>
+inline
+void
+DoFAccessor<structdim,DH>::copy_from (
+  const TriaAccessorBase<structdim, DH::dimension, DH::space_dimension> &da)
+{
+  Assert (this->dof_handler != 0, ExcInvalidObject());
+  BaseClass::copy_from(da);
+}
+
+
+
 template <int structdim, class DH>
 inline
 void
index e7b0e8d0960294086889a56443ba5ed85ade6fe1..2425da41e289f693b1a93a74f91e996a4396a447 100644 (file)
@@ -78,13 +78,6 @@ namespace TriaAccessorExceptions
                                   /**
                                    * @ingroup Exceptions
                                    */
-  DeclException1 (ExcInvalidNeighbor,
-                 int,
-                 << "Neighbor indices must be between 0 and 2^dim-1, but "
-                 << "yours was " << arg1);
-                                  /**
-                                   * @ingroup Exceptions
-                                   */
   DeclException0 (ExcCellHasNoChildren);
                                   /**
                                    * @ingroup Exceptions
@@ -676,6 +669,7 @@ class TriaAccessorBase<dim,dim,spacedim>
  * for syntactic correctness, none of the functions do anything but
  * generate errors.
  *
+ * @ingroup Accessors
  * @author Wolfgang Bangerth, 2008
  */
 template <int structdim, int dim, int spacedim=dim>
@@ -779,6 +773,7 @@ class InvalidAccessor :  public TriaAccessorBase<structdim,dim,spacedim>
  * <code>spacedim@>dim</code> the triangulation is of a manifold
  * embedded in a higher dimensional space).
  *
+ * @ingroup Accessors
  * @author Wolfgang Bangerth and others, 1998, 2000, 2008
  */
 template <int structdim, int dim, int spacedim>
index f83877e04dd712d536d4a2421fddda3392aeac74..c9055a63a8b0e168b1724e0bb72f49fe0e415cc3 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by the deal.II authors
+//    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
@@ -2029,8 +2029,7 @@ inline
 int
 CellAccessor<dim,spacedim>::neighbor_index (const unsigned int i) const 
 {
-  Assert (i<GeometryInfo<dim>::faces_per_cell,
-         TriaAccessorExceptions::ExcInvalidNeighbor(i));
+  AssertIndexRange (i,GeometryInfo<dim>::faces_per_cell);
   return this->tria->levels[this->present_level]->
     neighbors[this->present_index*GeometryInfo<dim>::faces_per_cell+i].second;
 }
@@ -2042,8 +2041,7 @@ inline
 int
 CellAccessor<dim,spacedim>::neighbor_level (const unsigned int i) const
 {
-  Assert (i<GeometryInfo<dim>::faces_per_cell,
-         TriaAccessorExceptions::ExcInvalidNeighbor(i));
+  AssertIndexRange (i, GeometryInfo<dim>::faces_per_cell);
   return this->tria->levels[this->present_level]->
     neighbors[this->present_index*GeometryInfo<dim>::faces_per_cell+i].first;
 }
index 5b11ada07641a4266582f406e0e49a3a91238aac..736aa0d48eda77dc7963b38ffe2267aa464f44f7 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by the deal.II authors
+//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
@@ -388,6 +388,24 @@ class TriaRawIterator :
                                      */
     TriaRawIterator & operator = (const TriaRawIterator &);
     
+                                    /**
+                                     *  Assignment operator.
+                                     */
+//    template <class OtherAccessor>
+//    TriaRawIterator & operator = (const TriaRawIterator<OtherAccessor>&);
+    
+                                    /**
+                                     *  Assignment operator.
+                                     */
+//    template <class OtherAccessor>
+//    TriaRawIterator & operator = (const TriaIterator<OtherAccessor>&);
+    
+                                    /**
+                                     *  Assignment operator.
+                                     */
+//    template <class OtherAccessor>
+//    TriaRawIterator & operator = (const TriaActiveIterator<OtherAccessor>&);
+    
                                     /**
                                      *  Compare for equality.
                                      */
@@ -671,8 +689,8 @@ class TriaIterator : public TriaRawIterator<Accessor>
                                      *  Assignment operator.
                                      */
     TriaIterator<Accessor> &
-    operator = (const TriaIterator<Accessor> &);
-
+    operator = (const TriaIterator<Accessor>&);
+    
                                     /**
                                      *  Cross assignment operator. This
                                      *  assignment is only valid if the
@@ -680,7 +698,29 @@ class TriaIterator : public TriaRawIterator<Accessor>
                                      *  element.
                                      */
     TriaIterator<Accessor> &
-    operator = (const TriaRawIterator<Accessor> &);
+    operator = (const TriaRawIterator<Accessor>&);
+    
+                                    /**
+                                     *  Assignment
+                                     *  operator. Requires, that
+                                     *  Accessor can be copied from
+                                     *  OtherAccessor.
+                                     */
+    template <class OtherAccessor>
+    TriaIterator<Accessor> &
+    operator = (const TriaIterator<OtherAccessor>&);
+
+                                    /**
+                                     *  Cross assignment operator. This
+                                     *  assignment is only valid if the
+                                     *  given iterator points to a used
+                                     *  element. Requires, that
+                                     *  Accessor can be copied from
+                                     *  OtherAccessor.
+                                     */
+   template <class OtherAccessor>
+   TriaIterator<Accessor> &
+   operator = (const TriaRawIterator<OtherAccessor>&);
 
                                     /**@name Advancement of iterators*/
                                     /*@{*/
@@ -835,6 +875,15 @@ class TriaActiveIterator : public TriaIterator<Accessor>
     TriaActiveIterator<Accessor> &
     operator = (const TriaActiveIterator<Accessor> &);
 
+                                    /**
+                                     *  Cross assignment operator. This
+                                     *  assignment is only valid if the
+                                     *  given iterator points to an active
+                                     *  element.
+                                     */
+    TriaActiveIterator<Accessor> &
+    operator = (const TriaIterator<Accessor> &);
+
                                     /**
                                      *  Cross assignment operator. This
                                      *  assignment is only valid if the
@@ -844,14 +893,38 @@ class TriaActiveIterator : public TriaIterator<Accessor>
     TriaActiveIterator<Accessor> &
     operator = (const TriaRawIterator<Accessor> &);
 
+                                    /**
+                                     *  Assignment operator. Requires, that
+                                     *  Accessor can be copied from
+                                     *  OtherAccessor.
+                                     */
+    template <class OtherAccessor>
+    TriaActiveIterator<Accessor> &
+    operator = (const TriaActiveIterator<OtherAccessor> &);
+
+                                    /**
+                                     *  Cross assignment operator. This
+                                     *  assignment is only valid if the
+                                     *  given iterator points to an active
+                                     *  element or past the end. Requires, that
+                                     *  Accessor can be copied from
+                                     *  OtherAccessor.
+                                     */
+   template <class OtherAccessor>
+   TriaActiveIterator<Accessor> &
+   operator = (const TriaRawIterator<OtherAccessor> &);
+
                                     /**
                                      *  Cross assignment operator. This
                                      *  assignment is only valid if the
                                      *  given iterator points to an active
-                                     *  element or past the end.
+                                     *  element. Requires, that
+                                     *  Accessor can be copied from
+                                     *  OtherAccessor.
                                      */
-    TriaActiveIterator<Accessor> &
-    operator = (const TriaIterator<Accessor> &);
+   template <class OtherAccessor>
+   TriaActiveIterator<Accessor> &
+   operator = (const TriaIterator<OtherAccessor> &);
 
                                     /**
                                      *  Prefix <tt>++</tt> operator: <tt>++i</tt>. This
index 396bdd34d10861173a0ddb9b60ae46af38b1acd9..1f9ef4fea5cdccc4798cb69da23e98e757658fc3 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2008 by the deal.II authors
+//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2008, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
@@ -70,6 +70,39 @@ TriaRawIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i)
 }
 
 
+// template <typename Accessor>
+// template <typename OtherAccessor>
+// inline
+// TriaRawIterator<Accessor> &
+// TriaRawIterator<Accessor>::operator = (const TriaRawIterator<OtherAccessor> &i)
+// {
+//   accessor.copy_from (i.accessor);
+//   return *this;
+// }
+
+
+// template <typename Accessor>
+// template <typename OtherAccessor>
+// inline
+// TriaRawIterator<Accessor> &
+// TriaRawIterator<Accessor>::operator = (const TriaIterator<OtherAccessor> &i)
+// {
+//   accessor.copy_from (i.accessor);
+//   return *this;
+// }
+
+
+// template <typename Accessor>
+// template <typename OtherAccessor>
+// inline
+// TriaRawIterator<Accessor> &
+// TriaRawIterator<Accessor>::operator = (const TriaActiveIterator<OtherAccessor> &i)
+// {
+//   accessor.copy_from (i.accessor);
+//   return *this;
+// }
+
+
 template <typename Accessor>
 inline
 bool
@@ -180,7 +213,19 @@ TriaIterator<Accessor>::TriaIterator (const Triangulation<Accessor::dimension,Ac
 template <typename Accessor>
 inline
 TriaIterator<Accessor> &
-TriaIterator<Accessor>::operator = (const TriaIterator<Accessor> &i) {
+TriaIterator<Accessor>::operator = (const TriaIterator<Accessor> &i)
+{
+  this->accessor.copy_from (i.accessor);
+  return *this;
+}
+
+
+template <typename Accessor>
+template <typename OtherAccessor>
+inline
+TriaIterator<Accessor> &
+TriaIterator<Accessor>::operator = (const TriaIterator<OtherAccessor> &i)
+{
   this->accessor.copy_from (i.accessor);
   return *this;
 }
@@ -189,7 +234,8 @@ TriaIterator<Accessor>::operator = (const TriaIterator<Accessor> &i) {
 template <typename Accessor>
 inline
 TriaIterator<Accessor> &
-TriaIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i) {
+TriaIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i)
+{
   this->accessor.copy_from (i.accessor);
 #ifdef DEBUG
                                   // do this like this, because:
@@ -207,8 +253,31 @@ TriaIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i) {
 
 
 template <typename Accessor>
+template <typename OtherAccessor>
 inline
-TriaIterator<Accessor> & TriaIterator<Accessor>::operator ++ () {
+TriaIterator<Accessor> &
+TriaIterator<Accessor>::operator = (const TriaRawIterator<OtherAccessor> &i)
+{
+  this->accessor.copy_from (i.accessor);
+#ifdef DEBUG
+                                  // do this like this, because:
+                                  // if we write
+                                  // "Assert (IteratorState::past_the_end || used)"
+                                  // used() is called anyway, even if
+                                  // state==IteratorState::past_the_end, and will then
+                                  // throw the exception!
+  if (this->state() != IteratorState::past_the_end) 
+    Assert (this->accessor.used(),
+           ExcAssignmentOfUnusedObject());
+#endif  
+  return *this;
+}
+
+
+template <typename Accessor>
+inline
+TriaIterator<Accessor> & TriaIterator<Accessor>::operator ++ ()
+{
   while (TriaRawIterator<Accessor>::operator++(),
         (this->state() == IteratorState::valid))
     if (this->accessor.used() == true)
@@ -219,7 +288,8 @@ TriaIterator<Accessor> & TriaIterator<Accessor>::operator ++ () {
 
 template <typename Accessor>
 inline
-TriaIterator<Accessor>  TriaIterator<Accessor>::operator ++ (int) {
+TriaIterator<Accessor>  TriaIterator<Accessor>::operator ++ (int)
+{
   TriaIterator<Accessor> tmp(*this);
   operator++ ();
   
@@ -230,7 +300,8 @@ TriaIterator<Accessor>  TriaIterator<Accessor>::operator ++ (int) {
 template <typename Accessor>
 inline
 TriaIterator<Accessor> &
-TriaIterator<Accessor>::operator -- () {
+TriaIterator<Accessor>::operator -- ()
+{
   while (TriaRawIterator<Accessor>::operator--(),
         (this->state() == IteratorState::valid))
     if (this->accessor.used() == true)
@@ -242,7 +313,8 @@ TriaIterator<Accessor>::operator -- () {
 template <typename Accessor>
 inline
 TriaIterator<Accessor>
-TriaIterator<Accessor>::operator -- (int) {
+TriaIterator<Accessor>::operator -- (int)
+{
   TriaIterator<Accessor> tmp(*this);
   operator-- ();
   
@@ -328,16 +400,51 @@ TriaActiveIterator<Accessor>::TriaActiveIterator (const Triangulation<Accessor::
 template <typename Accessor>
 inline
 TriaActiveIterator<Accessor> &
-TriaActiveIterator<Accessor>::operator = (const TriaActiveIterator<Accessor> &i) {
+TriaActiveIterator<Accessor>::operator = (const TriaActiveIterator<Accessor> &i)
+{
   this->accessor.copy_from (i.accessor);
   return *this;
 }
 
 
 template <typename Accessor>
+template <class OtherAccessor>
 inline
 TriaActiveIterator<Accessor> &
-TriaActiveIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i) {
+TriaActiveIterator<Accessor>::operator = (const TriaActiveIterator<OtherAccessor> &i)
+{
+  this->accessor.copy_from (i.accessor);
+  return *this;
+}
+
+
+template <typename Accessor>
+inline
+TriaActiveIterator<Accessor> &
+TriaActiveIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i)
+{
+  this->accessor.copy_from (i.accessor);
+#ifdef DEBUG
+                                  // do this like this, because:
+                                  // if we write
+                                  // "Assert (IteratorState::past_the_end || !has_children())"
+                                  // has_chidlren() is called anyway, even if
+                                  // state==IteratorState::past_the_end, and will then
+                                  // throw the exception!
+  if (this->state() != IteratorState::past_the_end) 
+    Assert (this->accessor.used() && this->accessor.has_children()==false,
+           ExcAssignmentOfInactiveObject());
+#endif  
+  return *this;
+}
+
+
+template <typename Accessor>
+template <class OtherAccessor>
+inline
+TriaActiveIterator<Accessor> &
+TriaActiveIterator<Accessor>::operator = (const TriaRawIterator<OtherAccessor> &i)
+{
   this->accessor.copy_from (i.accessor);
 #ifdef DEBUG
                                   // do this like this, because:
@@ -355,9 +462,32 @@ TriaActiveIterator<Accessor>::operator = (const TriaRawIterator<Accessor> &i) {
 
 
 template <typename Accessor>
+template <class OtherAccessor>
 inline
 TriaActiveIterator<Accessor> &
-TriaActiveIterator<Accessor>::operator = (const TriaIterator<Accessor> &i) {
+TriaActiveIterator<Accessor>::operator = (const TriaIterator<OtherAccessor> &i)
+{
+  this->accessor.copy_from (i.accessor);
+#ifdef DEBUG
+                                  // do this like this, because:
+                                  // if we write
+                                  // "Assert (IteratorState::past_the_end || !has_children())"
+                                  // has_children() is called anyway, even if
+                                  // state==IteratorState::past_the_end, and will then
+                                  // throw the exception!
+  if (this->state() != IteratorState::past_the_end) 
+    Assert (this->accessor.has_children()==false,
+           ExcAssignmentOfInactiveObject());
+#endif  
+  return *this;
+}
+
+
+template <typename Accessor>
+inline
+TriaActiveIterator<Accessor> &
+TriaActiveIterator<Accessor>::operator = (const TriaIterator<Accessor> &i)
+{
   this->accessor.copy_from (i.accessor);
 #ifdef DEBUG
                                   // do this like this, because:
index 8202baa93cdd30129659013fdeaa0da188f882e5..4f6ab581b570038b56cfb3062b8fdd27650830d0 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by the deal.II authors
+//    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
@@ -1237,8 +1237,7 @@ template <int dim, int spacedim>
 void CellAccessor<dim, spacedim>::set_neighbor (const unsigned int i,
                                                const TriaIterator<CellAccessor<dim, spacedim> > &pointer) const
 {
-  Assert (i<GeometryInfo<dim>::faces_per_cell,
-         TriaAccessorExceptions::ExcInvalidNeighbor(i));
+  AssertIndexRange (i, GeometryInfo<dim>::faces_per_cell);
 
   if (pointer.state() == IteratorState::valid)
     {
@@ -1265,8 +1264,7 @@ void CellAccessor<dim, spacedim>::set_neighbor (const unsigned int i,
 template <int dim, int spacedim>
 unsigned int CellAccessor<dim,spacedim>::neighbor_of_neighbor_internal (const unsigned int neighbor) const
 {
-  Assert (neighbor < GeometryInfo<dim>::faces_per_cell,
-         TriaAccessorExceptions::ExcInvalidNeighbor(neighbor));
+  AssertIndexRange (neighbor, GeometryInfo<dim>::faces_per_cell);
 
   if (dim==1)
     return GeometryInfo<dim>::opposite_face[neighbor];
@@ -1341,8 +1339,7 @@ template <int dim, int spacedim>
 std::pair<unsigned int, unsigned int>
 CellAccessor<dim, spacedim>::neighbor_of_coarser_neighbor (const unsigned int neighbor) const
 {
-  Assert (neighbor < GeometryInfo<dim>::faces_per_cell,
-         TriaAccessorExceptions::ExcInvalidNeighbor(neighbor));
+  AssertIndexRange (neighbor, GeometryInfo<dim>::faces_per_cell);
                                   // make sure that the neighbor is
                                   // on a coarser level
   Assert (neighbor_is_coarser(neighbor),
index cb36bc9a8747fd9b57c4e46c76374a4e856ee1f7..002b7a948da48ba333174f8bd4be15ec35bc576e 100644 (file)
@@ -589,6 +589,14 @@ inconvenience this causes.
 <h3>deal.II</h3>
 
 <ol>
+
+  <li>
+  <p> Improved: DoFHandler iterators now can be assigned from a Triangulation iterator
+  after the dof handler was set once.
+  <br>
+  (GK 2010/03/25)
+  </p></li>
+  
   <li>
   <p>
   New: The function DoFRenumbering::downstream has now an additional bool

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.