]> https://gitweb.dealii.org/ - dealii.git/commitdiff
MGTransferBlock with target_component
authorGuido Kanschat <dr.guido.kanschat@gmail.com>
Fri, 11 Jul 2003 18:51:32 +0000 (18:51 +0000)
committerGuido Kanschat <dr.guido.kanschat@gmail.com>
Fri, 11 Jul 2003 18:51:32 +0000 (18:51 +0000)
git-svn-id: https://svn.dealii.org/trunk@7875 0785d39b-7218-0410-832d-ea1e28bc413d

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 1e4bee572c0c871b7593d3817a7f26b4665b1016..173ad810273225d7b9c244eb95465cc510937925 100644 (file)
@@ -624,7 +624,7 @@ copy_to_mg (const MGDoFHandler<dim>             &mg_dof_handler,
            {
 //TODO:[GK] Not sure if this works if components are selected
              dst[level](level_dof_indices[i])
-                 = src(global_dof_indices[i]);
+               = src(global_dof_indices[i]);
            }
 //TODO: Special treatment of faces? Copy from MGTransferPrebuilt when done there.
        }
index a3ba71f313d2160bb080c848c8d6aaf2fb434c20..42bc9452af846a7c894e3e07c35f3a090f509b48 100644 (file)
@@ -388,8 +388,9 @@ MGTools::reinit_vector (const MGDoFHandler<dim>& mg_dof,
 }
 
 
-
-
+//TODO:[GK] Check if this function can be simplified
+// It took quite a lot of try and error to make it work with
+// target_component, so it is more grown than designed
 
 template<int dim, typename number>
 void
@@ -418,25 +419,33 @@ MGTools::reinit_vector (const MGDoFHandler<dim>& mg_dof,
   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<bool> target_selected(selected.size(), false);
+  for (unsigned int i=0;i<selected.size();++i)
+    if (selected[i]) target_selected[target_component[i]] = true;
+  
+  unsigned int n_selected = std::accumulate(target_selected.begin(),
+                                           target_selected.end(),
+                                           0U);
+  
   std::vector<std::vector<unsigned int> >
     ndofs(mg_dof.get_tria().n_levels(),
          std::vector<unsigned int>(target_component.size()));
 
-  count_dofs_per_component (mg_dof, ndofs);
+  count_dofs_per_component (mg_dof, ndofs, target_component);
   
   for (unsigned int level=v.get_minlevel();
        level<=v.get_maxlevel();++level)
     {
       v[level].reinit(n_selected, 0);
       unsigned int k=0;
-      for (unsigned int i=0;i<selected.size();++i)
-       if (selected[i])
-         v[level].block(k++).reinit(ndofs[level][i]);
-      v[level].collect_sizes();
+      for (unsigned int i=0;i<selected.size() && (k<v[level].n_blocks());++i)
+       {
+         if (selected[i])
+           {
+             v[level].block(k++).reinit(ndofs[level][i]);
+           }
+         v[level].collect_sizes();
+       }
     }
 }
 
index 94a28756407a66c0556a01eb9107e06c1d123a1d..b10ff85066cbb714d1a7ce66dc0890baa6dbc962 100644 (file)
@@ -296,12 +296,6 @@ void MGTransferSelect<number>::build_matrices (
   s[select] = true;
 
   target_component = t_component;
-  if (target_component.size() == 0)
-    {
-      target_component.resize(ncomp);
-      for (unsigned int i=0;i<ncomp;++i)
-       target_component[i] = i;
-    }
   
   MGTransferBlockBase::build_matrices (mg_dof, s);
 }

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.