]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
must check this at home
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 11 Jul 2003 15:35:41 +0000 (15:35 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 11 Jul 2003 15:35:41 +0000 (15:35 +0000)
git-svn-id: https://svn.dealii.org/trunk@7873 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/include/multigrid/mg_dof_tools.h
deal.II/deal.II/include/multigrid/mg_transfer.templates.h
deal.II/deal.II/source/multigrid/mg_dof_tools.cc
deal.II/deal.II/source/multigrid/mg_transfer_block.cc

index 738b96204d4245a35f8bb9907d1b1985d4dc071b..99ce9dcb268036bb3eaeb15032d4a64f06fceb18 100644 (file)
@@ -167,12 +167,19 @@ class MGTools
                                      * sorted by component in order
                                      * to obtain reasonable results
                                      * from this function.
+                                     *
+                                     * The argument
+                                     * @p{target_component} allows to
+                                     * re-sort and groupt components
+                                     * as in
+                                     * @p{DoFRenumbering::component_wise}.
                                      */
     template <int dim, typename number>
       static void
       reinit_vector (const MGDoFHandler<dim>& mg_dof,
                     MGLevelObject<BlockVector<number> >& v,
-                    const std::vector<bool>& selected);
+                    const std::vector<bool>& selected,
+                    const std::vector<unsigned int>& target_component);
 };
 
 
index 828e0865a0f4f7f4c171eb445b120ed869f901b1..1e4bee572c0c871b7593d3817a7f26b4665b1016 100644 (file)
@@ -21,6 +21,7 @@
 #include <numerics/data_out.h>
 #include <multigrid/mg_base.h>
 #include <multigrid/mg_dof_accessor.h>
+#include <multigrid/mg_dof_tools.h>
 #include <multigrid/mg_transfer.h>
 
 #include <algorithm>
@@ -581,9 +582,7 @@ copy_to_mg (const MGDoFHandler<dim>             &mg_dof_handler,
   
   dst.clear();
 
-//TODO:[GK] Make sure dst is not too large and sizes is filled  
-  for (unsigned int l=minlevel;l<=maxlevel;++l)
-    dst[l].reinit(sizes[l]);
+  MGTools::reinit_vector(mg_dof_handler, dst, selected, target_component);
   
   std::vector<unsigned int> global_dof_indices (dofs_per_cell);
   std::vector<unsigned int> level_dof_indices  (dofs_per_cell);
index 09ac11fb1ad736a92c3918974ba007496a254058..a44c269283e51924dc401465cd155c0a2ed7269e 100644 (file)
@@ -395,7 +395,8 @@ template<int dim, typename number>
 void
 MGTools::reinit_vector (const MGDoFHandler<dim>& mg_dof,
                         MGLevelObject<BlockVector<number> >& v,
-                        const std::vector<bool>& selected_in)
+                        const std::vector<bool>& selected_in,
+                       const std::vector<unsigned int>& target_component)
 {
                                   // Copy selection vector to
                                   // non-const since we may want to
@@ -408,30 +409,33 @@ MGTools::reinit_vector (const MGDoFHandler<dim>& mg_dof,
                                   // all components are selected.
   if (selected.size() == 0)
     {
-      selected.resize(ncomp);
-      std::fill_n (selected.begin(), ncomp, true);
+      selected.resize(target_component.size());
+      std::fill_n (selected.begin(), ncomp, false);
+      for (unsigned int i=0;i<target_component.size();++i)
+       selected[target_component[i]] = true;
     }
 
-  Assert (selected.size() == ncomp,
-         ExcDimensionMismatch(selected.size(), ncomp));
+  Assert (selected.size() == target_component.size(),
+         ExcDimensionMismatch(selected.size(), target_component.size()));
 
   unsigned int n_selected = std::accumulate (selected.begin(),
                                             selected.end(),
                                             0U);
                             
   std::vector<std::vector<unsigned int> >
-    ndofs(mg_dof.n_levels(), ncomp);
+    ndofs(mg_dof.get_tria().n_levels(), target_component.size());
 
   count_dofs_per_component (mg_dof, ndofs);
   
   for (unsigned int level=v.get_minlevel();
        level<=v.get_maxlevel();++level)
     {
-      v[level].reinit(n_selected);
+      v[level].reinit(n_selected, 0);
       unsigned int k=0;
-      for (unsigned int i=0;i<ncomp;++i)
+      for (unsigned int i=0;i<selected.size();++i)
        if (selected[i])
          v[level].block(k++).reinit(ndofs[level][i]);
+      v[level].collect_sizes();
     }
 }
 
@@ -530,13 +534,26 @@ MGTools::make_flux_sparsity_pattern<deal_II_dimension> (const MGDoFHandler<deal_
 
 #endif
 
-template void MGTools::reinit_vector<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-                                       MGLevelObject<Vector<double> >&);
-template void MGTools::reinit_vector<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-                                       MGLevelObject<Vector<float> >&);
-
-
-
-template void MGTools::count_dofs_per_component<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-                                                  std::vector<std::vector<unsigned int> >&,
-                                                                   std::vector<unsigned int> guidos_special_arg);
+template void MGTools::reinit_vector<deal_II_dimension> (
+  const MGDoFHandler<deal_II_dimension>&,
+  MGLevelObject<Vector<double> >&);
+template void MGTools::reinit_vector<deal_II_dimension> (
+  const MGDoFHandler<deal_II_dimension>&,
+  MGLevelObject<Vector<float> >&);
+
+template void MGTools::reinit_vector<deal_II_dimension> (
+  const MGDoFHandler<deal_II_dimension>&,
+  MGLevelObject<BlockVector<double> >&,
+  const std::vector<bool>&,
+  const std::vector<unsigned int>&);
+template void MGTools::reinit_vector<deal_II_dimension> (
+  const MGDoFHandler<deal_II_dimension>&,
+  MGLevelObject<BlockVector<float> >&,
+  const std::vector<bool>&,
+  const std::vector<unsigned int>&);
+
+
+template void MGTools::count_dofs_per_component<deal_II_dimension> (
+  const MGDoFHandler<deal_II_dimension>&,
+  std::vector<std::vector<unsigned int> >&,
+  std::vector<unsigned int>);
index 9c41d0cd1933211307ee9de09ae9b0a570cceb5a..94a28756407a66c0556a01eb9107e06c1d123a1d 100644 (file)
@@ -27,6 +27,8 @@
 #include <multigrid/mg_transfer.templates.h>
 #include <multigrid/mg_dof_tools.h>
 
+#include <algorithm>
+
 template <int dim>
 void MGTransferBlockBase::build_matrices (
   const MGDoFHandler<dim>& mg_dof,
@@ -41,25 +43,25 @@ void MGTransferBlockBase::build_matrices (
       Assert (target_component.size() == mg_dof.get_fe().n_components(),
              ExcDimensionMismatch(target_component.size(),
                                   mg_dof.get_fe().n_components()));
-//      unsigned int previous = 0;
+      
       for (unsigned int i=0;i<target_component.size();++i)
        {
          Assert(i<target_component.size(),
                 ExcIndexRange(i,0,target_component.size()));
-//       Assert(previous<=i,ExcIndexRange(i,previous,previous+1));
-//       Assert(i<=previous+1,ExcIndexRange(i,previous,previous+1));
        }
     }
   
   const FiniteElement<dim>& fe = mg_dof.get_fe();
-  const unsigned int n_components  = fe.n_components();
+
+  const unsigned int n_components  =
+    *std::max_element(target_component.begin(), target_component.end()) + 1;
   const unsigned int dofs_per_cell = fe.dofs_per_cell;  
   const unsigned int n_levels      = mg_dof.get_tria().n_levels();
   
   selected = select;
   
-  Assert (selected.size() == n_components,
-         ExcDimensionMismatch(selected.size(), n_components))
+  Assert (selected.size() == fe.n_components(),
+         ExcDimensionMismatch(selected.size(), fe.n_components()))
 
   sizes.resize(n_levels);
   MGTools::count_dofs_per_component(mg_dof, sizes, target_component);
@@ -142,7 +144,6 @@ void MGTransferBlockBase::build_matrices (
            prolongation_sparsities[level]->block(i,j)
              .reinit(sizes[level+1][i],
                      sizes[level][j],
-//TODO:[GK] Split this by component to save memory
                      dofs_per_cell+1);
          else
            prolongation_sparsities[level]->block(i,j)

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.