]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
fix copy_to/from_mg
authorkanschat <kanschat@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 1 May 2007 21:36:49 +0000 (21:36 +0000)
committerkanschat <kanschat@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 1 May 2007 21:36:49 +0000 (21:36 +0000)
git-svn-id: https://svn.dealii.org/trunk@14651 0785d39b-7218-0410-832d-ea1e28bc413d

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

index e48cdac38a40eeb26af39fb20526c8d03b6c35db..31acdcd5edd0c0d09fa1c7f437856d10dd14600c 100644 (file)
@@ -24,6 +24,7 @@
 #  include <lac/block_sparsity_pattern.h>
 #endif
 #include <lac/vector_memory.h>
+#include <lac/block_matrix_array.h>
 
 #include <multigrid/mg_base.h>
 #include <multigrid/mg_level_object.h>
@@ -90,6 +91,12 @@ class MGTransferBlockBase
                                    */
     std::vector<bool> selected;
 
+                                    /**
+                                     * Number of blocks of multigrid
+                                     * vector.
+                                     */
+    unsigned int n_mg_blocks;
+    
                                     /**
                                      * For each block of the whole
                                      * block vector, list to what
index fba513ae2d656b01606e083f77e87b1e8641368c..0ad3afee42782bc09f3e98e533cd0b705f321b62 100644 (file)
@@ -42,13 +42,22 @@ MGTransferBlockSelect<number>::copy_to_mg (
   MGLevelObject<Vector<number> > &dst,
   const BlockVector<number2>     &src) const
 {
-  MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected, sizes);
+  MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected_block, sizes);
                                   // For MGTransferBlockSelect, the
                                   // multilevel block is always the
-                                  // first, since only one block is selected.
-  for (unsigned int level=0;level<mg_dof_handler.get_tria().n_levels();++level)
-    for (IT i= copy_indices[selected_block][level].begin();i!= copy_indices[selected_block][level].end();++i)
-      dst[level](i->second) = src.block(selected_block)(i->first);
+                                  // first, since only one block is
+                                  // selected.
+  bool first = true;
+  for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;)
+    {
+      --level;
+      for (IT i= copy_indices[selected_block][level].begin();
+          i != copy_indices[selected_block][level].end();++i)
+       dst[level](i->second) = src.block(selected_block)(i->first);
+      if (!first)
+       restrict_and_add (level+1, dst[level], dst[level+1]);
+      first = false;
+    }
 }
 
 
@@ -61,14 +70,21 @@ MGTransferBlockSelect<number>::copy_to_mg (
   MGLevelObject<Vector<number> > &dst,
   const Vector<number2>          &src) const
 {
-  MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected, sizes);
+  MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected_block, sizes);
                                   // For MGTransferBlockSelect, the
                                   // multilevel block is always the
                                   // first, since only one block is selected.
-  for (unsigned int level=0;level<mg_dof_handler.get_tria().n_levels();++level)
-    for (IT i= copy_indices[selected_block][level].begin();
-        i != copy_indices[selected_block][level].end();++i)
-      dst[level](i->second) = src(i->first);
+  bool first = true;
+  for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;)
+    {
+      --level;
+      for (IT i= copy_indices[selected_block][level].begin();
+          i != copy_indices[selected_block][level].end();++i)
+       dst[level](i->second) = src(i->first);
+      if (!first)
+       restrict_and_add (level+1, dst[level], dst[level+1]);
+      first = false;
+    }      
 }
 
 
@@ -158,12 +174,19 @@ MGTransferBlock<number>::copy_to_mg (
   const BlockVector<number2>& src) const
 {
   MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected, sizes);
-  for (unsigned int block=0;block<selected.size();++block)
-    if (selected[block])
-      for (unsigned int level=0;level<mg_dof_handler.get_tria().n_levels();++level)
-       for (IT i= copy_indices[block][level].begin();
-            i != copy_indices[block][level].end();++i)
-         dst[level].block(mg_block[block])(i->second) = src.block(block)(i->first);
+  bool first = true;
+  for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;)
+    {
+      --level;
+      for (unsigned int block=0;block<selected.size();++block)
+       if (selected[block])
+         for (IT i= copy_indices[block][level].begin();
+              i != copy_indices[block][level].end();++i)
+           dst[level].block(mg_block[block])(i->second) = src.block(block)(i->first);
+      if (!first)
+       restrict_and_add (level+1, dst[level], dst[level+1]);
+      first = false;
+    }
 }
 
 
index 9ff04129f65926f53d7f3987b51c84a1a7a6e8c3..a859fb73eded38033d0c961ed8b9112dcfa2b8ed 100644 (file)
@@ -51,15 +51,13 @@ void MGTransferBlockBase::build_matrices (
                                   // blocks and blocks used for
                                   // multigrid computations.
   mg_block.resize(n_blocks);
-  if (true)
-    {
-      unsigned int k=0;
-      for (unsigned int i=0;i<n_blocks;++i)
-       if (selected[i])
-         mg_block[i] = k++;
-       else
-         mg_block[i] = deal_II_numbers::invalid_unsigned_int;
-    }
+  n_mg_blocks = 0;
+  for (unsigned int i=0;i<n_blocks;++i)
+    if (selected[i])
+      mg_block[i] = n_mg_blocks++;
+    else
+      mg_block[i] = deal_II_numbers::invalid_unsigned_int;
+  
                                   // Compute the lengths of all blocks
   sizes.resize(n_levels);
   MGTools::count_dofs_per_block(mg_dof, sizes);

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.