From b278860018cda6005bc9b8c27a848f7a91873114 Mon Sep 17 00:00:00 2001
From: Wolfgang Bangerth <bangerth@math.tamu.edu>
Date: Wed, 27 Nov 2013 15:17:29 +0000
Subject: [PATCH] Work around the Intel ICC bug that leads to forgotten
 template instantiations.

git-svn-id: https://svn.dealii.org/trunk@31811 0785d39b-7218-0410-832d-ea1e28bc413d
---
 deal.II/doc/news/changes.h                    | 13 ++++++++
 .../include/deal.II/numerics/vector_tools.h   | 10 +++---
 .../deal.II/numerics/vector_tools.templates.h | 32 +++++++++----------
 .../numerics/vector_tools_interpolate.inst.in |  2 +-
 4 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h
index 89ec0b712c..26b054bb08 100644
--- a/deal.II/doc/news/changes.h
+++ b/deal.II/doc/news/changes.h
@@ -40,6 +40,19 @@ inconvenience this causes.
 </p>
 
 <ol>
+  <li>
+  Changed: The kinds of template arguments for the VectorTools::interpolate
+  function taking a Mapping as first argument has changed. This was done to
+  work around a bug in the Intel ICC compiler which led to linker errors. Since
+  the actual function argument list remains unchanged, the only way you will
+  notice this change is if you <i>explicitly</i> specify template arguments.
+  The only place one would typically do that is if you take the address of
+  a template function. Since this is not a common operation, the impact of this
+  change is probably limited.
+  <br>
+  (Wolfgang Bangerth, 2013/11/27)
+  </li>
+
   <li>
   Changed: The ghost handling of the parallel::distributed::Vector class has
   been reworked: The vector now carries a global state that stores whether
diff --git a/deal.II/include/deal.II/numerics/vector_tools.h b/deal.II/include/deal.II/numerics/vector_tools.h
index daf77a045d..28c5fa3f10 100644
--- a/deal.II/include/deal.II/numerics/vector_tools.h
+++ b/deal.II/include/deal.II/numerics/vector_tools.h
@@ -451,11 +451,11 @@ namespace VectorTools
    * replaced by a hp::MappingCollection in
    * case of a hp::DoFHandler.
    */
-  template <class VECTOR, class DH>
-  void interpolate (const Mapping<DH::dimension,DH::space_dimension>    &mapping,
-                    const DH              &dof,
-                    const Function<DH::space_dimension>   &function,
-                    VECTOR                &vec);
+  template <class VECTOR, int dim, int spacedim, template <int,int> class DH>
+  void interpolate (const Mapping<dim,spacedim>    &mapping,
+                    const DH<dim,spacedim>         &dof,
+                    const Function<spacedim>       &function,
+                    VECTOR                         &vec);
 
   /**
    * Calls the @p interpolate()
diff --git a/deal.II/include/deal.II/numerics/vector_tools.templates.h b/deal.II/include/deal.II/numerics/vector_tools.templates.h
index a3748c86b8..77cc717739 100644
--- a/deal.II/include/deal.II/numerics/vector_tools.templates.h
+++ b/deal.II/include/deal.II/numerics/vector_tools.templates.h
@@ -74,24 +74,22 @@ DEAL_II_NAMESPACE_OPEN
 namespace VectorTools
 {
 
-  template <class VECTOR, class DH>
-  void interpolate (const Mapping<DH::dimension,DH::space_dimension>    &mapping,
-                    const DH              &dof,
-                    const Function<DH::space_dimension>   &function,
-                    VECTOR                &vec)
+  template <class VECTOR, int dim, int spacedim, template <int,int> class DH>
+  void interpolate (const Mapping<dim,spacedim>    &mapping,
+                    const DH<dim,spacedim>         &dof,
+                    const Function<spacedim>       &function,
+                    VECTOR                         &vec)
   {
-    const unsigned int dim=DH::dimension;
-
     Assert (dof.get_fe().n_components() == function.n_components,
             ExcDimensionMismatch(dof.get_fe().n_components(),
                                  function.n_components));
 
-    const hp::FECollection<DH::dimension,DH::space_dimension> fe (dof.get_fe());
+    const hp::FECollection<dim,spacedim> fe (dof.get_fe());
     const unsigned int          n_components = fe.n_components();
     const bool                  fe_is_system = (n_components != 1);
 
-    typename DH::active_cell_iterator cell = dof.begin_active(),
-                                      endc = dof.end();
+    typename DH<dim,spacedim>::active_cell_iterator cell = dof.begin_active(),
+						    endc = dof.end();
 
     // For FESystems many of the
     // unit_support_points will appear
@@ -180,7 +178,7 @@ namespace VectorTools
     const unsigned int max_rep_points = *std::max_element (n_rep_points.begin(),
                                                            n_rep_points.end());
     std::vector<types::global_dof_index> dofs_on_cell (fe.max_dofs_per_cell());
-    std::vector<Point<DH::space_dimension> >  rep_points (max_rep_points);
+    std::vector<Point<spacedim> >  rep_points (max_rep_points);
 
     // get space for the values of the
     // function at the rep support points.
@@ -199,9 +197,9 @@ namespace VectorTools
 
     // Transformed support points are computed by
     // FEValues
-    hp::MappingCollection<dim,DH::space_dimension> mapping_collection (mapping);
+    hp::MappingCollection<dim,spacedim> mapping_collection (mapping);
 
-    hp::FEValues<dim, DH::space_dimension> fe_values (mapping_collection,
+    hp::FEValues<dim,spacedim> fe_values (mapping_collection,
                                                       fe, support_quadrature, update_quadrature_points);
 
     for (; cell!=endc; ++cell)
@@ -213,7 +211,7 @@ namespace VectorTools
           // get location of finite element
           // support_points
           fe_values.reinit(cell);
-          const std::vector<Point<DH::space_dimension> > &support_points =
+          const std::vector<Point<spacedim> > &support_points =
             fe_values.get_present_fe_values().get_quadrature_points();
 
           // pick out the representative
@@ -5218,11 +5216,11 @@ namespace VectorTools
         case H1_norm:
           exponent = 2.;
           break;
-	  
+
         case L1_norm:
           exponent = 1.;
           break;
-	  
+
         default:
           break;
         }
@@ -5247,7 +5245,7 @@ namespace VectorTools
           if (spacedim == dim+1)
 	    update_flags |= UpdateFlags (update_normal_vectors);
           // no break!
-	  
+
         default:
           update_flags |= UpdateFlags (update_values);
           break;
diff --git a/deal.II/source/numerics/vector_tools_interpolate.inst.in b/deal.II/source/numerics/vector_tools_interpolate.inst.in
index e44dd85c4e..bbc0d6b237 100644
--- a/deal.II/source/numerics/vector_tools_interpolate.inst.in
+++ b/deal.II/source/numerics/vector_tools_interpolate.inst.in
@@ -22,7 +22,7 @@ for (VEC : SERIAL_VECTORS ; deal_II_dimension : DIMENSIONS; deal_II_space_dimens
 
       template
         void interpolate
-        (const Mapping<DoFHandler<deal_II_dimension,deal_II_space_dimension>::dimension,DoFHandler<deal_II_dimension,deal_II_space_dimension>::space_dimension>&,
+        (const Mapping<deal_II_dimension,deal_II_space_dimension> &,
          const DoFHandler<deal_II_dimension,deal_II_space_dimension>&,
          const Function<deal_II_space_dimension>&,
          VEC&);
-- 
2.39.5