]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Make MeshWorker components work in 1d as well.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 6 Aug 2010 02:56:35 +0000 (02:56 +0000)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 6 Aug 2010 02:56:35 +0000 (02:56 +0000)
git-svn-id: https://svn.dealii.org/trunk@21613 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/include/numerics/mesh_worker_info.h
deal.II/deal.II/include/numerics/mesh_worker_info.templates.h
deal.II/deal.II/source/numerics/mesh_worker_info.cc
deal.II/deal.II/source/numerics/mesh_worker_vector_selector.cc

index 3979448325a042af8ae34f330a4936e8b3b7aabe..d9d4efb2723b1e5546a899a27f329f225fcf0bc3 100644 (file)
@@ -14,6 +14,7 @@
 #define __deal2__mesh_worker_info_h
 
 #include <base/config.h>
+#include <base/quadrature_lib.h>
 #include <boost/shared_ptr.hpp>
 #include <dofs/block_info.h>
 #include <fe/fe_values.h>
@@ -943,6 +944,139 @@ namespace MeshWorker
 
 //----------------------------------------------------------------------//
 
+  template<int dim, int sdim>
+  inline
+  IntegrationInfo<dim,sdim>::IntegrationInfo()
+                 :
+                 fevalv(0),
+                 multigrid(false),
+                 global_data(boost::shared_ptr<VectorDataBase<dim, sdim> >(new VectorDataBase<dim, sdim>))
+  {}
+
+
+  template<int dim, int sdim>
+  inline
+  IntegrationInfo<dim,sdim>::IntegrationInfo(const IntegrationInfo<dim,sdim>& other)
+                 :
+                 multigrid(other.multigrid),
+                 values(other.values),
+                 gradients(other.gradients),
+                 hessians(other.hessians),
+                 global_data(other.global_data),
+                 n_components(other.n_components)
+  {
+    fevalv.resize(other.fevalv.size());
+    for (unsigned int i=0;i<other.fevalv.size();++i)
+      {
+       const FEValuesBase<dim,sdim>& p = *other.fevalv[i];
+       const FEValues<dim,sdim>* pc = dynamic_cast<const FEValues<dim,sdim>*>(&p);
+       const FEFaceValues<dim,sdim>* pf = dynamic_cast<const FEFaceValues<dim,sdim>*>(&p);
+       const FESubfaceValues<dim,sdim>* ps = dynamic_cast<const FESubfaceValues<dim,sdim>*>(&p);
+
+       if (pc != 0)
+         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
+           reinterpret_cast<FEFaceValuesBase<dim,sdim>*>(
+             new FEValues<dim,sdim> (pc->get_mapping(), pc->get_fe(),
+                                     pc->get_quadrature(), pc->get_update_flags())));
+       else if (pf != 0)
+         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
+           new FEFaceValues<dim,sdim> (pf->get_mapping(), pf->get_fe(), pf->get_quadrature(), pf->get_update_flags()));
+       else if (ps != 0)
+         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
+           new FESubfaceValues<dim,sdim> (ps->get_mapping(), ps->get_fe(), ps->get_quadrature(), ps->get_update_flags()));
+       else
+         Assert(false, ExcInternalError());
+      }
+  }
+
+
+  template <>
+  inline
+  IntegrationInfo<1,1>::IntegrationInfo(const IntegrationInfo<1,1>& other)
+                 :
+                 multigrid(other.multigrid),
+                 values(other.values),
+                 gradients(other.gradients),
+                 hessians(other.hessians),
+                 global_data(other.global_data),
+                 n_components(other.n_components)
+  {
+    const int dim = 1;
+    const int sdim = 1;
+
+    fevalv.resize(other.fevalv.size());
+    for (unsigned int i=0;i<other.fevalv.size();++i)
+      {
+       const FEValuesBase<dim,sdim>& p = *other.fevalv[i];
+       const FEValues<dim,sdim>* pc = dynamic_cast<const FEValues<dim,sdim>*>(&p);
+       const FEFaceValues<dim,sdim>* pf = dynamic_cast<const FEFaceValues<dim,sdim>*>(&p);
+       const FESubfaceValues<dim,sdim>* ps = dynamic_cast<const FESubfaceValues<dim,sdim>*>(&p);
+
+       if (pc != 0)
+         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
+           reinterpret_cast<FEFaceValuesBase<dim,sdim>*>(
+             new FEValues<dim,sdim> (pc->get_mapping(), pc->get_fe(),
+                                     pc->get_quadrature(), pc->get_update_flags())));
+       else if (pf != 0)
+         {
+           Assert (false, ExcImpossibleInDim(1));
+           fevalv[i].reset ();
+         }
+       else if (ps != 0)
+         {
+           Assert (false, ExcImpossibleInDim(1));
+           fevalv[i].reset();
+         }
+       else
+         Assert(false, ExcInternalError());
+      }
+  }
+
+
+  template <>
+  inline
+  IntegrationInfo<1,2>::IntegrationInfo(const IntegrationInfo<1,2>& other)
+                 :
+                 multigrid(other.multigrid),
+                 values(other.values),
+                 gradients(other.gradients),
+                 hessians(other.hessians),
+                 global_data(other.global_data),
+                 n_components(other.n_components)
+  {
+    const int dim = 1;
+    const int sdim = 2;
+
+    fevalv.resize(other.fevalv.size());
+    for (unsigned int i=0;i<other.fevalv.size();++i)
+      {
+       const FEValuesBase<dim,sdim>& p = *other.fevalv[i];
+       const FEValues<dim,sdim>* pc = dynamic_cast<const FEValues<dim,sdim>*>(&p);
+       const FEFaceValues<dim,sdim>* pf = dynamic_cast<const FEFaceValues<dim,sdim>*>(&p);
+       const FESubfaceValues<dim,sdim>* ps = dynamic_cast<const FESubfaceValues<dim,sdim>*>(&p);
+
+       if (pc != 0)
+         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
+           reinterpret_cast<FEFaceValuesBase<dim,sdim>*>(
+             new FEValues<dim,sdim> (pc->get_mapping(), pc->get_fe(),
+                                     pc->get_quadrature(), pc->get_update_flags())));
+       else if (pf != 0)
+         {
+           Assert (false, ExcImpossibleInDim(1));
+           fevalv[i].reset();
+         }
+       else if (ps != 0)
+         {
+           Assert (false, ExcImpossibleInDim(1));
+           fevalv[i].reset();
+         }
+       else
+         Assert(false, ExcInternalError());
+      }
+  }
+
+
+
   template<int dim, int sdim>
   template <class FEVALUES>
   inline void
@@ -1012,7 +1146,41 @@ namespace MeshWorker
        else
          {
                                             // This is a cell
-           FEValues<dim>& fe = dynamic_cast<FEValues<dim>&> (febase);
+           FEValues<dim,spacedim>& fe = dynamic_cast<FEValues<dim,spacedim>&> (febase);
+           fe.reinit(info.cell);
+         }
+      }
+
+    const bool split_fevalues = info.block_info != 0;
+    if (!global_data->empty())
+      fill_local_data(info, split_fevalues);
+  }
+
+
+  template <>
+  inline void
+  IntegrationInfo<1,1>::reinit(const DoFInfo<1,1>& info)
+  {
+    const int dim = 1;
+    const int spacedim = 1;
+
+    for (unsigned int i=0;i<fevalv.size();++i)
+      {
+       FEValuesBase<dim, spacedim>& febase = *fevalv[i];
+       if (info.sub_number != deal_II_numbers::invalid_unsigned_int)
+         {
+                                            // This is a subface
+           Assert (false, ExcImpossibleInDim(1));
+         }
+       else if (info.face_number != deal_II_numbers::invalid_unsigned_int)
+         {
+                                            // This is a face
+           Assert (false, ExcImpossibleInDim(1));
+         }
+       else
+         {
+                                            // This is a cell
+           FEValues<dim,spacedim>& fe = dynamic_cast<FEValues<dim,spacedim>&> (febase);
            fe.reinit(info.cell);
          }
       }
@@ -1023,6 +1191,94 @@ namespace MeshWorker
   }
 
 
+  template <>
+  inline void
+  IntegrationInfo<1,2>::reinit(const DoFInfo<1,2>& info)
+  {
+    const int dim = 1;
+    const int spacedim = 2;
+
+    for (unsigned int i=0;i<fevalv.size();++i)
+      {
+       FEValuesBase<dim, spacedim>& febase = *fevalv[i];
+       if (info.sub_number != deal_II_numbers::invalid_unsigned_int)
+         {
+                                            // This is a subface
+           Assert (false, ExcImpossibleInDim(1));
+         }
+       else if (info.face_number != deal_II_numbers::invalid_unsigned_int)
+         {
+                                            // This is a face
+           Assert (false, ExcImpossibleInDim(1));
+         }
+       else
+         {
+                                            // This is a cell
+           FEValues<dim,spacedim>& fe = dynamic_cast<FEValues<dim,spacedim>&> (febase);
+           fe.reinit(info.cell);
+         }
+      }
+
+    const bool split_fevalues = info.block_info != 0;
+    if (!global_data->empty())
+      fill_local_data(info, split_fevalues);
+  }
+
+
+  template <int dim, int sdim>
+  inline
+  void
+  IntegrationInfoBox<dim,sdim>::
+  initialize(const FiniteElement<dim,sdim>& el,
+            const Mapping<dim,sdim>& mapping,
+            const BlockInfo* block_info)
+  {
+    cell.template initialize<FEValues<dim,sdim> >(el, mapping, cell_quadrature,
+                                                 cell_flags, block_info);
+    boundary.template initialize<FEFaceValues<dim,sdim> >(el, mapping, boundary_quadrature,
+                                                         boundary_flags, block_info);
+    face.template initialize<FEFaceValues<dim,sdim> >(el, mapping, face_quadrature,
+                                                     face_flags, block_info);
+    subface.template initialize<FESubfaceValues<dim,sdim> >(el, mapping, face_quadrature,
+                                                           face_flags, block_info);
+    neighbor.template initialize<FEFaceValues<dim,sdim> >(el, mapping, face_quadrature,
+                                                         neighbor_flags, block_info);
+  }
+
+
+  template <>
+  inline
+  void
+  IntegrationInfoBox<1,1>::
+  initialize(const FiniteElement<1,1>& el,
+            const Mapping<1,1>& mapping,
+            const BlockInfo* block_info)
+  {
+    const int dim = 1;
+    const int sdim = 1;
+
+    cell.initialize<FEValues<dim,sdim> >(el, mapping, cell_quadrature,
+                                        cell_flags, block_info);
+  }
+
+
+
+  template <>
+  inline
+  void
+  IntegrationInfoBox<1,2>::
+  initialize(const FiniteElement<1,2>& el,
+            const Mapping<1,2>& mapping,
+            const BlockInfo* block_info)
+  {
+    const int dim = 1;
+    const int sdim = 2;
+
+    cell.initialize<FEValues<dim,sdim> >(el, mapping, cell_quadrature,
+                                        cell_flags, block_info);
+  }
+
+
 //----------------------------------------------------------------------//
 
   template <int dim, int sdim>
@@ -1099,6 +1355,44 @@ namespace MeshWorker
   void
   IntegrationInfoBox<dim,sdim>::post_faces(const DoFInfoBox<dim, DOFINFO>&)
   {}
+
+
+  template <int dim, int sdim>
+  inline
+  void
+  IntegrationInfoBox<dim,sdim>::initialize_gauss_quadrature(
+    unsigned int cp,
+    unsigned int bp,
+    unsigned int fp)
+  {
+    cell_quadrature = QGauss<dim>(cp);
+    boundary_quadrature = QGauss<dim-1>(bp);
+    face_quadrature = QGauss<dim-1>(fp);
+  }
+
+
+  template <>
+  inline
+  void
+  IntegrationInfoBox<1,1>::initialize_gauss_quadrature(
+    unsigned int cp,
+    unsigned int bp,
+    unsigned int fp)
+  {
+    cell_quadrature = QGauss<1>(cp);
+  }
+
+
+  template <>
+  inline
+  void
+  IntegrationInfoBox<1,2>::initialize_gauss_quadrature(
+    unsigned int cp,
+    unsigned int bp,
+    unsigned int fp)
+  {
+    cell_quadrature = QGauss<1>(cp);
+  }
 }
 
 DEAL_II_NAMESPACE_CLOSE
index 40f12d38b34ecc7672db2c33e8718e021a9b97a3..bf0dfd398d3389d0255c643bdbc902ee5eb106b4 100644 (file)
@@ -76,50 +76,6 @@ namespace MeshWorker
 
 //----------------------------------------------------------------------//
 
-  template<int dim, int sdim>
-  IntegrationInfo<dim,sdim>::IntegrationInfo()
-                 :
-                 fevalv(0),
-                 multigrid(false),
-                 global_data(boost::shared_ptr<VectorDataBase<dim, sdim> >(new VectorDataBase<dim, sdim>))
-  {}
-
-
-  template<int dim, int sdim>
-  IntegrationInfo<dim,sdim>::IntegrationInfo(const IntegrationInfo<dim,sdim>& other)
-                 :
-                 multigrid(other.multigrid),
-                 values(other.values),
-                 gradients(other.gradients),
-                 hessians(other.hessians),
-                 global_data(other.global_data),
-                 n_components(other.n_components)
-  {
-    fevalv.resize(other.fevalv.size());
-    for (unsigned int i=0;i<other.fevalv.size();++i)
-      {
-       const FEValuesBase<dim,sdim>& p = *other.fevalv[i];
-       const FEValues<dim,sdim>* pc = dynamic_cast<const FEValues<dim,sdim>*>(&p);
-       const FEFaceValues<dim,sdim>* pf = dynamic_cast<const FEFaceValues<dim,sdim>*>(&p);
-       const FESubfaceValues<dim,sdim>* ps = dynamic_cast<const FESubfaceValues<dim,sdim>*>(&p);
-
-       if (pc != 0)
-         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
-           reinterpret_cast<FEFaceValuesBase<dim,sdim>*>(
-             new FEValues<dim,sdim> (pc->get_mapping(), pc->get_fe(),
-                                     pc->get_quadrature(), pc->get_update_flags())));
-       else if (pf != 0)
-         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
-           new FEFaceValues<dim,sdim> (pf->get_mapping(), pf->get_fe(), pf->get_quadrature(), pf->get_update_flags()));
-       else if (ps != 0)
-         fevalv[i] = boost::shared_ptr<FEValuesBase<dim,sdim> > (
-           new FESubfaceValues<dim,sdim> (ps->get_mapping(), ps->get_fe(), ps->get_quadrature(), ps->get_update_flags()));
-       else
-         Assert(false, ExcInternalError());
-      }
-  }
-
-
   template<int dim, int sdim>
   void
   IntegrationInfo<dim,sdim>::initialize_data(
@@ -195,7 +151,7 @@ namespace MeshWorker
        for (unsigned int b=0;b<info.block_info->local().size();++b)
          {
            const unsigned int fe_no = info.block_info->base_element(b);
-           const FEValuesBase<dim>& fe = this->fe_values(fe_no);
+           const FEValuesBase<dim,sdim>& fe = this->fe_values(fe_no);
            const unsigned int n_comp = fe.get_fe().n_components();
            const unsigned int block_start = info.block_info->local().block_start(b);
            const unsigned int block_size = info.block_info->local().block_size(b);
@@ -211,7 +167,7 @@ namespace MeshWorker
        }
      else
        {
-        const FEValuesBase<dim>& fe = this->fe_values(0);
+        const FEValuesBase<dim,sdim>& fe = this->fe_values(0);
         const unsigned int n_comp = fe.get_fe().n_components();
          if(info.level_cell)
         this->global_data->mg_fill(values, gradients, hessians, fe, info.cell->level(), info.indices,
@@ -267,40 +223,6 @@ namespace MeshWorker
     if (face) face_flags |= flags;
     if (neighbor) neighbor_flags |= flags;
   }
-
-
-  template <int dim, int sdim>
-  void
-  IntegrationInfoBox<dim,sdim>::initialize_gauss_quadrature(
-    unsigned int cp,
-    unsigned int bp,
-    unsigned int fp)
-  {
-    cell_quadrature = QGauss<dim>(cp);
-    boundary_quadrature = QGauss<dim-1>(bp);
-    face_quadrature = QGauss<dim-1>(fp);
-
-  }
-
-
-  template <int dim, int sdim>
-  void
-  IntegrationInfoBox<dim,sdim>::
-  initialize(const FiniteElement<dim,sdim>& el,
-            const Mapping<dim,sdim>& mapping,
-            const BlockInfo* block_info)
-  {
-    cell.template initialize<FEValues<dim,sdim> >(el, mapping, cell_quadrature,
-                                                 cell_flags, block_info);
-    boundary.template initialize<FEFaceValues<dim,sdim> >(el, mapping, boundary_quadrature,
-                                                         boundary_flags, block_info);
-    face.template initialize<FEFaceValues<dim,sdim> >(el, mapping, face_quadrature,
-                                                     face_flags, block_info);
-    subface.template initialize<FESubfaceValues<dim,sdim> >(el, mapping, face_quadrature,
-                                                           face_flags, block_info);
-    neighbor.template initialize<FEFaceValues<dim,sdim> >(el, mapping, face_quadrature,
-                                                         neighbor_flags, block_info);
-  }
 }
 
 
index 3d6d8f6d834aecca779d6f2332fd56a7e4435954..44fe4ad0c8dbf3988b7d7dccbaf879e98bdcd658 100644 (file)
 
 DEAL_II_NAMESPACE_OPEN
 
-#if deal_II_dimension > 1
 
 namespace MeshWorker
 {
   template class IntegrationInfo<deal_II_dimension, deal_II_dimension>;
   template class IntegrationInfoBox<deal_II_dimension, deal_II_dimension>;
-  
+
   template class DoFInfo<deal_II_dimension,deal_II_dimension,float>;
   template class DoFInfoBox<deal_II_dimension,
                            DoFInfo<deal_II_dimension,deal_II_dimension,float> >;
-  
+
   template void IntegrationInfo<deal_II_dimension>::fill_local_data(
     const DoFInfo<deal_II_dimension, deal_II_dimension, float>&, bool);
-  
+
   template class DoFInfo<deal_II_dimension,deal_II_dimension,double>;
   template class DoFInfoBox<deal_II_dimension,
                            DoFInfo<deal_II_dimension,deal_II_dimension,double> >;
-  
+
   template void IntegrationInfo<deal_II_dimension>::fill_local_data(
     const DoFInfo<deal_II_dimension, deal_II_dimension, double>&, bool);
-  
+
 //   template void IntegrationInfo<deal_II_dimension>
 //   ::initialize<FEValues<deal_II_dimension> >(
 //     const FiniteElement<deal_II_dimension>&, const Mapping<deal_II_dimension>&,
@@ -57,7 +56,6 @@ namespace MeshWorker
 //     const Quadrature<FESubfaceValues<deal_II_dimension>::integral_dimension>&, const UpdateFlags, const BlockInfo*);
 }
 
-#endif
 
 DEAL_II_NAMESPACE_CLOSE
 
index 41d651e01b4c033963f8bd5b55e17b4ae96f60d1..90c2b126421077eaa0257ae2fdcc49ec832ac207 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 2009 by the deal.II authors
+//    Copyright (C) 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
@@ -22,8 +22,6 @@
 
 DEAL_II_NAMESPACE_OPEN
 
-#if deal_II_dimension > 1
-
 namespace MeshWorker
 {
   template class VectorDataBase<deal_II_dimension>;
@@ -31,6 +29,6 @@ namespace MeshWorker
 #include "mesh_worker_vector_selector.inst"
 }
 
-#endif
+
 
 DEAL_II_NAMESPACE_CLOSE

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.