OK, here are two small example programs - one with hp and one without.



Am 04.05.10 15:27, schrieb Wolfgang Bangerth:
Is there something special in 1D? Because in higher dimensions
everything is working fine.
Not that I would know of. It may be a bug, but it's hard to tell without
more information.

W.

-------------------------------------------------------------------------
Wolfgang Bangerth                email:            [email protected]
                                  www: http://www.math.tamu.edu/~bangerth/


 #include <grid/tria.h>
 #include <hp/dof_handler.h>
 #include <grid/grid_generator.h>
 
 #include <grid/tria_accessor.h>
 #include <grid/tria_iterator.h>
 #include <dofs/dof_accessor.h>
 #include <hp/fe_collection.h>
 #include <fe/fe_q.h>
 
 #include <dofs/dof_tools.h>
 
 #include <hp/fe_values.h>
 #include <hp/q_collection.h>
 #include <base/quadrature_lib.h>
 
 #include <base/function.h>
 #include <numerics/vectors.h>
 #include <numerics/matrices.h>
 
 #include <lac/vector.h>
 #include <lac/full_matrix.h>
 #include <lac/sparse_matrix.h>
 #include <lac/solver_cg.h>
 #include <lac/precondition.h>
 
 #include <numerics/data_out.h>
 #include <fstream>
 #include <iostream>
 
 using namespace dealii;

 class ExactSolution: public Function<1> {
   public:
     ExactSolution ();
     virtual double value (const Point<1>& p, const unsigned int component = 0) 
const; 
 };

 class LaplaceProblem 
 {
   public:
     LaplaceProblem ();
 
     void run ();
     
   private:
     const ExactSolution exact_solution;
     void make_grid_and_dofs ();
     void assemble_system ();
     void solve ();
     void output_results () const;
 
     Triangulation<1>     triangulation;
     hp::FECollection<1>      fe;
     hp::DoFHandler<1>        dof_handler;
     hp::QCollection<1>   quadrature;
     SparsityPattern      sparsity_pattern;
     SparseMatrix<double> system_matrix;
 
     Vector<double>       solution;
     Vector<double>       system_rhs;
 };

 double ExactSolution::value (const Point<1>& p, const unsigned int) const {
    return p (0) * p (0);
 }
 
 ExactSolution::ExactSolution (): Function<1> () {
 }
 
 LaplaceProblem::LaplaceProblem () :
                dof_handler (triangulation)
 {
        fe.push_back (FE_Q<1> (1));
        quadrature.push_back (QGauss<1> (2));
 }

 void LaplaceProblem::make_grid_and_dofs ()
 {
   GridGenerator::hyper_cube (triangulation);
   triangulation.refine_global (2);
   std::cout << "Number of active cells: "
            << triangulation.n_active_cells()
            << std::endl;
   std::cout << "Total number of cells: "
            << triangulation.n_cells()
            << std::endl;
   
   dof_handler.distribute_dofs (fe);
   std::cout << "Number of degrees of freedom: "
            << dof_handler.n_dofs()
            << std::endl;
 
   sparsity_pattern.reinit (dof_handler.n_dofs(),
                           dof_handler.n_dofs(),
                           dof_handler.max_couplings_between_dofs());
   DoFTools::make_sparsity_pattern (dof_handler, sparsity_pattern);
   sparsity_pattern.compress();
 
   system_matrix.reinit (sparsity_pattern);
 
   solution.reinit (dof_handler.n_dofs());
   system_rhs.reinit (dof_handler.n_dofs());
 }

 void LaplaceProblem::assemble_system () 
 {
   hp::FEValues<1> fe_values (fe, quadrature, 
                         update_values | update_gradients | update_JxW_values);
   
   unsigned int   dofs_per_cell;
   unsigned int   n_q_points;
 
   FullMatrix<double>   cell_matrix;
   Vector<double>       cell_rhs;
 
   std::vector<unsigned int> local_dof_indices;
 
   hp::DoFHandler<1>::active_cell_iterator
     cell = dof_handler.begin_active(),
     endc = dof_handler.end();
   for (; cell!=endc; ++cell)
     {
       fe_values.reinit (cell);
       dofs_per_cell = cell->get_fe ().dofs_per_cell;
       cell_matrix.reinit (dofs_per_cell, dofs_per_cell);
       cell_matrix = 0;
       cell_rhs.reinit (dofs_per_cell);
       cell_rhs = 0;
       n_q_points = fe_values.get_present_fe_values ().n_quadrature_points;
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        for (unsigned int j=0; j<dofs_per_cell; ++j)
          for (unsigned int q_point=0; q_point<n_q_points; ++q_point)
            cell_matrix(i,j) += (fe_values.get_present_fe_values ().shape_grad 
(i, q_point) *
                                 fe_values.get_present_fe_values ().shape_grad 
(j, q_point) *
                                 fe_values.get_present_fe_values ().JxW 
(q_point));
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        for (unsigned int q_point=0; q_point<n_q_points; ++q_point)
          cell_rhs(i) += (-2.0 * fe_values.get_present_fe_values ().shape_value 
(i, q_point) *
                          fe_values.get_present_fe_values ().JxW (q_point));
 
       local_dof_indices.resize (dofs_per_cell);
       cell->get_dof_indices (local_dof_indices);
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        for (unsigned int j=0; j<dofs_per_cell; ++j)
          system_matrix.add (local_dof_indices[i],
                             local_dof_indices[j],
                             cell_matrix(i,j));
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        system_rhs(local_dof_indices[i]) += cell_rhs(i);
     }
 
 
   std::map<unsigned int,double> boundary_values;
   VectorTools::interpolate_boundary_values (dof_handler,
                                            0,
                                            exact_solution,
                                            boundary_values);
   VectorTools::interpolate_boundary_values (dof_handler,
                                            1,
                                            exact_solution,
                                            boundary_values);
   MatrixTools::apply_boundary_values (boundary_values,
                                      system_matrix,
                                      solution,
                                      system_rhs);
 }

 void LaplaceProblem::solve () 
 {
   SolverControl           solver_control (1000, 1e-12);
   SolverCG<>              cg (solver_control);
 
   cg.solve (system_matrix, solution, system_rhs,
            PreconditionIdentity());
 }

 void LaplaceProblem::output_results () const
 {
   DataOut<1, hp::DoFHandler<1> > data_out;
   data_out.attach_dof_handler (dof_handler);
   data_out.add_data_vector (solution, "solution");
   data_out.build_patches ();
 
   std::ofstream output ("solution.gpl");
   data_out.write_gnuplot (output);
   for (unsigned int dof = 0; dof < dof_handler.n_dofs (); ++dof)
   std::cout << solution (dof) << std::endl;
 }

 void LaplaceProblem::run () 
 {
   make_grid_and_dofs ();
   assemble_system ();
   solve ();
   output_results ();
 }

 int main () 
 {
   LaplaceProblem laplace_problem;
   laplace_problem.run ();
 
   return 0;
 }
 #include <grid/tria.h>
 #include <dofs/dof_handler.h>
 #include <grid/grid_generator.h>
 
 #include <grid/tria_accessor.h>
 #include <grid/tria_iterator.h>
 #include <dofs/dof_accessor.h>
 
 #include <fe/fe_q.h>
 
 #include <dofs/dof_tools.h>
 
 #include <fe/fe_values.h>
 #include <base/quadrature_lib.h>
 
 #include <base/function.h>
 #include <numerics/vectors.h>
 #include <numerics/matrices.h>
 
 #include <lac/vector.h>
 #include <lac/full_matrix.h>
 #include <lac/sparse_matrix.h>
 #include <lac/solver_cg.h>
 #include <lac/precondition.h>
 
 #include <numerics/data_out.h>
 #include <fstream>
 #include <iostream>
 
 using namespace dealii;

 class ExactSolution: public Function<1> {
   public:
     ExactSolution ();
     virtual double value (const Point<1>& p, const unsigned int component = 0) 
const; 
 };

 class LaplaceProblem 
 {
   public:
     LaplaceProblem ();
 
     void run ();
     
   private:
     const ExactSolution exact_solution;
     void make_grid_and_dofs ();
     void assemble_system ();
     void solve ();
     void output_results () const;
 
     Triangulation<1>     triangulation;
     FE_Q<1>              fe;
     DoFHandler<1>        dof_handler;
 
     SparsityPattern      sparsity_pattern;
     SparseMatrix<double> system_matrix;
 
     Vector<double>       solution;
     Vector<double>       system_rhs;
 };

 double ExactSolution::value (const Point<1>& p, const unsigned int) const {
    return p (0) * p (0);
 }
 
 ExactSolution::ExactSolution (): Function<1> () {
 }
 
 LaplaceProblem::LaplaceProblem () :
                 fe (1),
                dof_handler (triangulation)
 {}

 void LaplaceProblem::make_grid_and_dofs ()
 {
   GridGenerator::hyper_cube (triangulation);
   triangulation.refine_global (2);
   std::cout << "Number of active cells: "
            << triangulation.n_active_cells()
            << std::endl;
   std::cout << "Total number of cells: "
            << triangulation.n_cells()
            << std::endl;
   
   dof_handler.distribute_dofs (fe);
   std::cout << "Number of degrees of freedom: "
            << dof_handler.n_dofs()
            << std::endl;
 
   sparsity_pattern.reinit (dof_handler.n_dofs(),
                           dof_handler.n_dofs(),
                           dof_handler.max_couplings_between_dofs());
   DoFTools::make_sparsity_pattern (dof_handler, sparsity_pattern);
   sparsity_pattern.compress();
 
   system_matrix.reinit (sparsity_pattern);
 
   solution.reinit (dof_handler.n_dofs());
   system_rhs.reinit (dof_handler.n_dofs());
 }

 void LaplaceProblem::assemble_system () 
 {
   QGauss<1>  quadrature_formula(2);
   FEValues<1> fe_values (fe, quadrature_formula, 
                         update_values | update_gradients | update_JxW_values);
   
   const unsigned int   dofs_per_cell = fe.dofs_per_cell;
   const unsigned int   n_q_points    = quadrature_formula.size();
 
   FullMatrix<double>   cell_matrix (dofs_per_cell, dofs_per_cell);
   Vector<double>       cell_rhs (dofs_per_cell);
 
   std::vector<unsigned int> local_dof_indices (dofs_per_cell);
 
   DoFHandler<1>::active_cell_iterator
     cell = dof_handler.begin_active(),
     endc = dof_handler.end();
   for (; cell!=endc; ++cell)
     {
       fe_values.reinit (cell);
 
       cell_matrix = 0;
       cell_rhs = 0;
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        for (unsigned int j=0; j<dofs_per_cell; ++j)
          for (unsigned int q_point=0; q_point<n_q_points; ++q_point)
            cell_matrix(i,j) += (fe_values.shape_grad (i, q_point) *
                                 fe_values.shape_grad (j, q_point) *
                                 fe_values.JxW (q_point));
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        for (unsigned int q_point=0; q_point<n_q_points; ++q_point)
          cell_rhs(i) += (-2.0 * fe_values.shape_value (i, q_point) *
                          fe_values.JxW (q_point));
 
       cell->get_dof_indices (local_dof_indices);
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        for (unsigned int j=0; j<dofs_per_cell; ++j)
          system_matrix.add (local_dof_indices[i],
                             local_dof_indices[j],
                             cell_matrix(i,j));
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
        system_rhs(local_dof_indices[i]) += cell_rhs(i);
     }
 
 
   std::map<unsigned int,double> boundary_values;
   VectorTools::interpolate_boundary_values (dof_handler,
                                            0,
                                            exact_solution,
                                            boundary_values);
   VectorTools::interpolate_boundary_values (dof_handler,
                                            1,
                                            exact_solution,
                                            boundary_values);
   MatrixTools::apply_boundary_values (boundary_values,
                                      system_matrix,
                                      solution,
                                      system_rhs);
 }

 void LaplaceProblem::solve () 
 {
   SolverControl           solver_control (1000, 1e-12);
   SolverCG<>              cg (solver_control);
 
   cg.solve (system_matrix, solution, system_rhs,
            PreconditionIdentity());
 }

 void LaplaceProblem::output_results () const
 {
   DataOut<1> data_out;
   data_out.attach_dof_handler (dof_handler);
   data_out.add_data_vector (solution, "solution");
   data_out.build_patches ();
 
   std::ofstream output ("solution.gpl");
   data_out.write_gnuplot (output);
 }

 void LaplaceProblem::run () 
 {
   make_grid_and_dofs ();
   assemble_system ();
   solve ();
   output_results ();
 }

 int main () 
 {
   LaplaceProblem laplace_problem;
   laplace_problem.run ();
 
   return 0;
 }
_______________________________________________
dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii

Reply via email to