]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add default constructor for hp::DoFHandler.
authorCe Qin <qince168@gmail.com>
Wed, 18 Apr 2018 13:22:08 +0000 (21:22 +0800)
committerCe Qin <qince168@gmail.com>
Thu, 19 Apr 2018 14:26:12 +0000 (22:26 +0800)
include/deal.II/hp/dof_handler.h
source/hp/dof_handler.cc

index 5545ef6501c5ed4d64d78b0c2988e25bd3e6d1b3..fd9547d766fdcf24ffd8ada1e941a45fcca43613 100644 (file)
@@ -253,6 +253,11 @@ namespace hp
     static const unsigned int default_fe_index = numbers::invalid_unsigned_int;
 
 
+    /**
+     * Default Constructor.
+     */
+    DoFHandler ();
+
     /**
      * Constructor. Take @p tria as the triangulation to work on.
      */
@@ -279,6 +284,13 @@ namespace hp
      */
     DoFHandler &operator = (const DoFHandler &) = delete;
 
+    /**
+     * Assign a Triangulation and a FECollection to the DoFHandler and compute
+     * the distribution of degrees of freedom over the mesh.
+     */
+    void initialize(const Triangulation<dim,spacedim> &tria,
+                    const hp::FECollection<dim,spacedim> &fe);
+
     /**
      * Go through the triangulation and "distribute" the degrees of
      * freedoms needed for the given finite element. "Distributing"
@@ -836,6 +848,11 @@ namespace hp
     std::unique_ptr<dealii::internal::DoFHandlerImplementation::Policy::PolicyBase<dim,spacedim> > policy;
 
 
+    /**
+     * Setup policy and listeners based on the underlying Triangulation.
+     */
+    void setup_policy_and_listeners ();
+
     /**
      * Free all used memory.
      */
index a8bf50e9edba91c1dda9963b056d51e840f9462a..bb8f2ec2f200cfd43ba5ba557d3ba46db22065cd 100644 (file)
@@ -959,34 +959,23 @@ namespace hp
 
 
 
+  template <int dim, int spacedim>
+  DoFHandler<dim,spacedim>::DoFHandler ()
+    :
+    tria(nullptr, typeid(*this).name()),
+    faces (nullptr)
+  {}
+
+
   template <int dim, int spacedim>
   DoFHandler<dim,spacedim>::DoFHandler (const Triangulation<dim,spacedim> &tria)
     :
     tria(&tria, typeid(*this).name()),
     faces (nullptr)
   {
-    // decide whether we need a sequential or a parallel shared/distributed policy
-    if (dynamic_cast<const parallel::shared::Triangulation< dim, spacedim>*> (&*this->tria) != nullptr)
-      policy = std_cxx14::make_unique<internal::DoFHandlerImplementation::Policy::ParallelShared<DoFHandler<dim,spacedim> >> (*this);
-    else if (dynamic_cast<const parallel::distributed::Triangulation< dim, spacedim >*> (&*this->tria) != nullptr)
-      policy = std_cxx14::make_unique<internal::DoFHandlerImplementation::Policy::ParallelDistributed<DoFHandler<dim,spacedim> >> (*this);
-    else
-      policy = std_cxx14::make_unique<internal::DoFHandlerImplementation::Policy::Sequential<DoFHandler<dim,spacedim> >> (*this);
+    setup_policy_and_listeners ();
 
     create_active_fe_table ();
-
-    tria_listeners.push_back
-    (tria.signals.pre_refinement
-     .connect (std::bind (&DoFHandler<dim,spacedim>::pre_refinement_action,
-                          std::ref(*this))));
-    tria_listeners.push_back
-    (tria.signals.post_refinement
-     .connect (std::bind (&DoFHandler<dim,spacedim>::post_refinement_action,
-                          std::ref(*this))));
-    tria_listeners.push_back
-    (tria.signals.create
-     .connect (std::bind (&DoFHandler<dim,spacedim>::post_refinement_action,
-                          std::ref(*this))));
   }
 
 
@@ -1269,6 +1258,25 @@ namespace hp
       active_fe_indices[i] = cell->active_fe_index();
   }
 
+  template <int dim, int spacedim>
+  void DoFHandler<dim,spacedim>::initialize(const Triangulation<dim,spacedim> &tria,
+                                            const hp::FECollection<dim,spacedim> &fe)
+  {
+    if (this->tria != &tria)
+      {
+        for (unsigned int i=0; i<tria_listeners.size(); ++i)
+          tria_listeners[i].disconnect ();
+        tria_listeners.clear ();
+
+        this->tria = &tria;
+
+        setup_policy_and_listeners ();
+      }
+
+    create_active_fe_table ();
+
+    distribute_dofs (fe);
+  }
 
 
   template <int dim, int spacedim>
@@ -1372,6 +1380,31 @@ namespace hp
   }
 
 
+  template <int dim, int spacedim>
+  void DoFHandler<dim,spacedim>::setup_policy_and_listeners ()
+  {
+    // decide whether we need a sequential or a parallel shared/distributed policy
+    if (dynamic_cast<const parallel::shared::Triangulation< dim, spacedim>*> (&*this->tria) != nullptr)
+      policy = std_cxx14::make_unique<internal::DoFHandlerImplementation::Policy::ParallelShared<DoFHandler<dim,spacedim> >> (*this);
+    else if (dynamic_cast<const parallel::distributed::Triangulation< dim, spacedim >*> (&*this->tria) != nullptr)
+      policy = std_cxx14::make_unique<internal::DoFHandlerImplementation::Policy::ParallelDistributed<DoFHandler<dim,spacedim> >> (*this);
+    else
+      policy = std_cxx14::make_unique<internal::DoFHandlerImplementation::Policy::Sequential<DoFHandler<dim,spacedim> >> (*this);
+
+    tria_listeners.push_back
+    (this->tria->signals.pre_refinement
+     .connect (std::bind (&DoFHandler<dim,spacedim>::pre_refinement_action,
+                          std::ref(*this))));
+    tria_listeners.push_back
+    (this->tria->signals.post_refinement
+     .connect (std::bind (&DoFHandler<dim,spacedim>::post_refinement_action,
+                          std::ref(*this))));
+    tria_listeners.push_back
+    (this->tria->signals.create
+     .connect (std::bind (&DoFHandler<dim,spacedim>::post_refinement_action,
+                          std::ref(*this))));
+  }
+
 
   template <int dim, int spacedim>
   void DoFHandler<dim,spacedim>::clear ()

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.