]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
enable disabling of multigrid
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Wed, 26 Sep 2001 14:17:13 +0000 (14:17 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Wed, 26 Sep 2001 14:17:13 +0000 (14:17 +0000)
git-svn-id: https://svn.dealii.org/trunk@5104 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/source/dofs/dof_renumbering.cc
deal.II/deal.II/source/dofs/dof_tools.cc
deal.II/deal.II/source/grid/intergrid_map.cc
tests/multigrid/mg1.cc [new file with mode: 0644]
tests/multigrid/mg1.checked [new file with mode: 0644]

index 6dfeda85d086d6b100d78da366f34fb9eeb38770..33484dea773dab7a4654a5687890e17dc4c6c4fa 100644 (file)
 #include <dofs/dof_handler.h>
 #include <dofs/dof_constraints.h>
 #include <dofs/dof_tools.h>
+#include <fe/fe.h>
+#include <numerics/dof_renumbering.h>
+
+#ifdef ENABLE_MULTIGRID
 #include <multigrid/mg_dof_handler.h>
 #include <multigrid/mg_dof_accessor.h>
 #include <multigrid/mg_dof_tools.h>
-#include <fe/fe.h>
-#include <numerics/dof_renumbering.h>
+#endif
 
 #include <vector>
 #include <map>
@@ -263,6 +266,7 @@ void DoFRenumbering::Cuthill_McKee (DoFHandler<dim>                 &dof_handler
 };
 
 
+#ifdef ENABLE_MULTIGRID
 template <int dim>
 void DoFRenumbering::Cuthill_McKee (MGDoFHandler<dim>               &dof_handler,
                                    const unsigned int               level,
@@ -427,7 +431,7 @@ void DoFRenumbering::Cuthill_McKee (MGDoFHandler<dim>               &dof_handler
                                   // thus needs an own function
   dof_handler.renumber_dofs (level, new_number);
 };
-
+#endif
 
 
 template <int dim>
@@ -616,7 +620,7 @@ DoFRenumbering::cell_wise_dg (DoFHandler<dim>& dof,
 }
 
 
-
+#ifdef ENABLE_MULTIGRID
 template <int dim>
 void
 DoFRenumbering::cell_wise_dg (MGDoFHandler<dim>& dof,
@@ -670,6 +674,7 @@ DoFRenumbering::cell_wise_dg (MGDoFHandler<dim>& dof,
 
   dof.renumber_dofs(level, reverse);
 }
+#endif
 
 /**
  * Provide comparator for DoFCellAccessors
@@ -720,7 +725,7 @@ DoFRenumbering::downstream_dg (DoFHandler<dim>& dof,
 }
 
 
-
+#ifdef ENABLE_MULTIGRID
 template <int dim>
 void
 DoFRenumbering::downstream_dg (MGDoFHandler<dim>& dof,
@@ -739,7 +744,7 @@ DoFRenumbering::downstream_dg (MGDoFHandler<dim>& dof,
 
   cell_wise_dg(dof, level, ordered_cells);
 }
-
+#endif
 
 
 template <int dim>
@@ -766,12 +771,6 @@ void DoFRenumbering::Cuthill_McKee (DoFHandler<deal_II_dimension>&,
                                    const bool,
                                    const std::vector<unsigned int>&);
 
-template
-void DoFRenumbering::Cuthill_McKee (MGDoFHandler<deal_II_dimension>&,
-                                   const unsigned int,
-                                   const bool,
-                                   const std::vector<unsigned int>&);
-
 template
 void DoFRenumbering::component_wise (DoFHandler<deal_II_dimension>&,
                                     const std::vector<unsigned int>&);
@@ -781,23 +780,31 @@ template
 void DoFRenumbering::cell_wise_dg (DoFHandler<deal_II_dimension>&,
                                   const std::vector<DoFHandler<deal_II_dimension>::cell_iterator>&);
 
-template
-void DoFRenumbering::cell_wise_dg (MGDoFHandler<deal_II_dimension>&,
-                                  const unsigned int,
-                                  const std::vector<MGDoFHandler<deal_II_dimension>::cell_iterator>&);
-
 template
 void DoFRenumbering::downstream_dg (DoFHandler<deal_II_dimension>&,
                                    const Point<deal_II_dimension>&);
 
-template
-void DoFRenumbering::downstream_dg (MGDoFHandler<deal_II_dimension>&,
-                                   const unsigned int,
-                                   const Point<deal_II_dimension>&);
-
 template
 void DoFRenumbering::sort_selected_dofs_back (DoFHandler<deal_II_dimension> &,
                                              const std::vector<bool> &);
 
 template
 void DoFRenumbering::random (DoFHandler<deal_II_dimension> &);
+
+#ifdef ENABLE_MULTIGRID
+template
+void DoFRenumbering::Cuthill_McKee (MGDoFHandler<deal_II_dimension>&,
+                                   const unsigned int,
+                                   const bool,
+                                   const std::vector<unsigned int>&);
+template
+void DoFRenumbering::cell_wise_dg (MGDoFHandler<deal_II_dimension>&,
+                                  const unsigned int,
+                                  const std::vector<MGDoFHandler<deal_II_dimension>::cell_iterator>&);
+
+template
+void DoFRenumbering::downstream_dg (MGDoFHandler<deal_II_dimension>&,
+                                   const unsigned int,
+                                   const Point<deal_II_dimension>&);
+
+#endif
index 29b164b48017c315377c351d857043b6ca80ab83..0ebc434783ed49f9c012c20f419f07e51d7f25b0 100644 (file)
@@ -21,8 +21,6 @@
 #include <dofs/dof_handler.h>
 #include <dofs/dof_accessor.h>
 #include <dofs/dof_constraints.h>
-#include <multigrid/mg_dof_handler.h>
-#include <multigrid/mg_dof_accessor.h>
 #include <fe/fe.h>
 #include <fe/fe_values.h>
 #include <dofs/dof_tools.h>
 #include <lac/block_sparsity_pattern.h>
 #include <lac/vector.h>
 
+#ifdef ENABLE_MULTIGRID
+#include <multigrid/mg_dof_handler.h>
+#include <multigrid/mg_dof_accessor.h>
+#endif
+
 #include <algorithm>
 #include <numeric>
 
@@ -899,6 +902,7 @@ DoFTools::extract_dofs (const DoFHandler<dim>      &dof,
 }
 
 
+#ifdef ENABLE_MULTIGRID
 template<int dim>
 void
 DoFTools::extract_level_dofs(const unsigned int       level,
@@ -929,7 +933,7 @@ DoFTools::extract_level_dofs(const unsigned int       level,
        }
     }
 }
-
+#endif
 
 
 #if deal_II_dimension != 1
@@ -2341,11 +2345,13 @@ DoFTools::distribute_cell_to_dof_vector (const DoFHandler<deal_II_dimension> &do
 template void DoFTools::extract_dofs(const DoFHandler<deal_II_dimension>& dof,
                                     const std::vector<bool>& component_select,
                                     std::vector<bool>& selected_dofs);
+
+#ifdef ENABLE_MULTIGRID
 template void DoFTools::extract_level_dofs(const unsigned int level,
                                           const MGDoFHandler<deal_II_dimension>& dof,
                                           const std::vector<bool>& component_select,
                                           std::vector<bool>& selected_dofs);
-
+#endif
 
 #if deal_II_dimension != 1
 template
index b39b094a9d8db082b8fe5ce897567daaa9aea530..6fa4bf0b681449fa1af9706f2a5e8c94bdd92ed0 100644 (file)
 #include <fe/fe.h>
 #include <grid/tria_accessor.h>
 #include <dofs/dof_accessor.h>
-#include <multigrid/mg_dof_handler.h>
-#include <multigrid/mg_dof_accessor.h>
 #include <grid/tria_iterator.h>
 #include <grid/intergrid_map.h>
 
+#ifdef ENABLE_MULTIGRID
+#include <multigrid/mg_dof_handler.h>
+#include <multigrid/mg_dof_accessor.h>
+#endif
 
 // helper function to aquire the number of levels within a grid
 template <class GridClass>
@@ -215,6 +217,7 @@ InterGridMap<GridClass,dim>::memory_consumption () const
 // explicit instantiations
 template class InterGridMap<Triangulation, deal_II_dimension>;
 template class InterGridMap<DoFHandler, deal_II_dimension>;
-template class InterGridMap<MGDoFHandler, deal_II_dimension>;
-
 
+#ifdef ENABLE_MULTIGRID
+template class InterGridMap<MGDoFHandler, deal_II_dimension>;
+#endif
diff --git a/tests/multigrid/mg1.cc b/tests/multigrid/mg1.cc
new file mode 100644 (file)
index 0000000..453a58c
--- /dev/null
@@ -0,0 +1,205 @@
+//----------------------------  mg.cc  ---------------------------
+//    $Id$
+//    Version: $Name$
+//
+//    Copyright (C) 1998, 1999, 2000, 2001 by the deal.II authors
+//
+//    This file is subject to QPL and may not be  distributed
+//    without copyright and license information. Please refer
+//    to the file deal.II/doc/license.html for the  text  and
+//    further information on this license.
+//
+//----------------------------  mg.cc  ---------------------------
+
+
+#include <base/function.h>
+#include <base/quadrature_lib.h>
+#include <base/logstream.h>
+#include <lac/vector.h>
+#include <lac/sparse_matrix.h>
+#include <lac/solver_cg.h>
+#include <lac/solver_richardson.h>
+#include <lac/vector_memory.h>
+#include <lac/precondition.h>
+#include <grid/tria.h>
+#include <grid/tria_iterator.h>
+#include <dofs/dof_constraints.h>
+#include <dofs/dof_accessor.h>
+#include <grid/grid_generator.h>
+#include <fe/fe_q.h>
+#include <fe/mapping_q1.h>
+#include <fe/fe_values.h>
+#include <dofs/dof_tools.h>
+
+#include <multigrid/mg_dof_handler.h>
+#include <multigrid/mg_dof_accessor.h>
+#include <multigrid/mg_dof_tools.h>
+#include <multigrid/mg_base.h>
+#include <multigrid/mg_smoother.h>
+#include <multigrid/multigrid.h>
+
+MappingQ1<2> mapping;
+
+#include "helmholtz.h"
+
+#include <fstream>
+
+
+template<int dim>
+class RHSFunction : public Function<dim>
+{
+  public:
+    virtual double value (const Point<dim>&,
+                         const unsigned int) const;
+};
+
+
+class MGSmootherLAC : public MGSmootherBase
+{
+  private:
+    SmartPointer<MGLevelObject<SparseMatrix<double> > >matrices;
+  public:
+    MGSmootherLAC(MGLevelObject<SparseMatrix<double> >&);
+    
+    virtual void smooth (const unsigned int level,
+                        Vector<double> &u,
+                        const Vector<double> &rhs) const;
+    
+};
+
+int main()
+{
+  try 
+    {
+  std::ofstream logfile("mg.output");
+  deallog.attach(logfile);
+  deallog.depth_console(0);
+
+  Helmholtz equation;
+  RHSFunction<2> rhs;
+  QGauss5<2> quadrature;
+  
+  FE_Q<2> fe1(1);
+  FE_Q<2> fe2(2);
+  FE_Q<2> fe3(3);
+  FE_Q<2> fe4(4);
+  for (unsigned int degree=1;degree<=3;degree++)
+    {
+      Triangulation<2> tr;
+      MGDoFHandler<2> mgdof(tr);
+      DoFHandler<2>& dof(mgdof);
+  
+      GridGenerator::hyper_cube(tr,-1.,1.);
+  
+      FiniteElement<2>* fe;
+      switch(degree)
+       {
+         case 1: fe = &fe1; deallog.push("Q1"); break;
+         case 2: fe = &fe2; deallog.push("Q2"); break;
+         case 3: fe = &fe3; deallog.push("Q3"); break;
+         case 4: fe = &fe4; deallog.push("Q4"); break;
+       }
+      
+      for (unsigned int step=0;step < 3; ++step)
+       {
+         tr.refine_global(1);
+         dof.distribute_dofs(*fe);
+
+         ConstraintMatrix hanging_nodes;
+         DoFTools::make_hanging_node_constraints(dof, hanging_nodes);
+         hanging_nodes.close();
+
+         const unsigned int size = dof.n_dofs();
+         deallog << "DoFs " << size << std::endl;
+         deallog << "Levels: " << tr.n_levels() << std::endl;
+         
+         SparsityPattern structure(size, dof.max_couplings_between_dofs());
+         DoFTools::make_sparsity_pattern(dof, structure);
+         structure.compress();
+         
+         SparseMatrix<double> A(structure);
+         Vector<double> f(size);
+         
+         equation.build_all(A,f,dof, quadrature, rhs);
+         
+         Vector<double> u;
+         u.reinit(f);
+         PrimitiveVectorMemory<> mem;
+         SolverControl control(1000, 1.e-10,false , true);
+         SolverCG<>    solver(control, mem);
+         
+         u = 0.;
+         MGLevelObject<SparsityPattern> mgstruct(0, tr.n_levels()-1);
+         MGLevelObject<SparseMatrix<double> > mgA(0,tr.n_levels()-1);
+         for (unsigned int i=0;i<tr.n_levels();++i)
+           {
+             mgstruct[i].reinit(mgdof.n_dofs(i), mgdof.n_dofs(i),
+                                mgdof.max_couplings_between_dofs());
+             MGDoFTools::make_sparsity_pattern(mgdof, mgstruct[i], i);
+             mgstruct[i].compress();
+             
+             mgA[i].reinit(mgstruct[i]);
+           }
+         equation.build_mgmatrix(mgA, mgdof, quadrature);
+
+         SolverControl cgcontrol(1000,1.e-12, false, false);
+         PrimitiveVectorMemory<> cgmem;
+         SolverCG<> cgsolver(cgcontrol, cgmem);
+         PreconditionIdentity cgprec;
+         MGCoarseGridLACIteration<SolverCG<>, SparseMatrix<double>, PreconditionIdentity>
+           coarse(cgsolver, mgA[0], cgprec);
+         
+         MGSmootherLAC smoother(mgA);
+         MGTransferPrebuilt transfer;
+         transfer.build_matrices(mgdof);
+
+
+Multigrid<2> multigrid(mgdof, hanging_nodes, mgstruct, mgA, transfer);
+         PreconditionMG<Multigrid<2> >
+           mgprecondition(multigrid, smoother, smoother, coarse);
+         
+         solver.solve(A, u, f, mgprecondition);
+       }
+      deallog.pop();
+    }
+
+    }
+  catch (const SolverControl::NoConvergence& e)
+    {
+      deallog << "Step " << e.last_step
+             << " Residual " << e.last_residual << std::endl;
+    }
+}
+
+template<int dim>
+double
+RHSFunction<dim>::value (const Point<dim>&,
+                        const unsigned int) const
+{
+  return 1.;
+}
+
+MGSmootherLAC::MGSmootherLAC(MGLevelObject<SparseMatrix<double> >& matrix)
+               :
+               matrices(&matrix)
+{}
+
+void
+MGSmootherLAC::smooth (const unsigned int level,
+                      Vector<double> &u,
+                      const Vector<double> &rhs) const
+{
+  SolverControl control(2,1.e-300,false,false);
+  PrimitiveVectorMemory<> mem;
+  SolverRichardson<> rich(control, mem);
+  PreconditionSSOR<> prec;
+  prec.initialize((*matrices)[level], 1.);
+
+  try
+    {
+      rich.solve((*matrices)[level], u, rhs, prec);
+    }
+  catch (const SolverControl::NoConvergence&)
+    {
+    }
+}
diff --git a/tests/multigrid/mg1.checked b/tests/multigrid/mg1.checked
new file mode 100644 (file)
index 0000000..6079191
--- /dev/null
@@ -0,0 +1,37 @@
+
+DEAL:Q1::DoFs 9
+DEAL:Q1::Levels: 2
+DEAL:Q1:cg::Starting 
+DEAL:Q1:cg::Convergence step 3 
+DEAL:Q1::DoFs 25
+DEAL:Q1::Levels: 3
+DEAL:Q1:cg::Starting 
+DEAL:Q1:cg::Convergence step 4 
+DEAL:Q1::DoFs 81
+DEAL:Q1::Levels: 4
+DEAL:Q1:cg::Starting 
+DEAL:Q1:cg::Convergence step 5 
+DEAL:Q2::DoFs 25
+DEAL:Q2::Levels: 2
+DEAL:Q2:cg::Starting 
+DEAL:Q2:cg::Convergence step 5 
+DEAL:Q2::DoFs 81
+DEAL:Q2::Levels: 3
+DEAL:Q2:cg::Starting 
+DEAL:Q2:cg::Convergence step 6 
+DEAL:Q2::DoFs 289
+DEAL:Q2::Levels: 4
+DEAL:Q2:cg::Starting 
+DEAL:Q2:cg::Convergence step 6 
+DEAL:Q3::DoFs 49
+DEAL:Q3::Levels: 2
+DEAL:Q3:cg::Starting 
+DEAL:Q3:cg::Convergence step 6 
+DEAL:Q3::DoFs 169
+DEAL:Q3::Levels: 3
+DEAL:Q3:cg::Starting 
+DEAL:Q3:cg::Convergence step 6 
+DEAL:Q3::DoFs 625
+DEAL:Q3::Levels: 4
+DEAL:Q3:cg::Starting 
+DEAL:Q3:cg::Convergence step 6 

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.