00001
00002 #ifndef _baerbel_plateproblem_h
00003 #define _baerbel_plateproblem_h
00004
00005 #include <base/convergence_table.h>
00006 #include <base/quadrature_lib.h>
00007 #include <base/function.h>
00008 #include <base/function_lib.h>
00009 #include <base/logstream.h>
00010 #include <base/smartpointer.h>
00011 #include <base/timer.h>
00012 #include <lac/vector.h>
00013 #include <lac/full_matrix.h>
00014 #include <lac/sparse_matrix.h>
00015 #include <lac/sparsity_pattern.h>
00016 #include <lac/solver_gmres.h>
00017 #include <lac/solver_cg.h>
00018 #include <lac/vector_memory.h>
00019 #include <lac/precondition.h>
00020 #include <grid/tria.h>
00021 #include <grid/grid_generator.h>
00022 #include <grid/tria_accessor.h>
00023 #include <grid/tria_iterator.h>
00024 #include <dofs/dof_handler.h>
00025 #include <dofs/dof_accessor.h>
00026 #include <dofs/dof_tools.h>
00027 #include <fe/fe_tools.h>
00028 #include <fe/fe_q.h>
00029 #include <fe/fe_values.h>
00030 #include <numerics/vectors.h>
00031 #include <numerics/solution_transfer.h>
00032 #include <numerics/matrices.h>
00033 #include <numerics/data_out.h>
00034
00035 #include <grid/grid_in.h>
00036 #include <grid/grid_out.h>
00037 #include <grid/tria_boundary_lib.h>
00038 #include <grid/intergrid_map.h>
00039
00040 #include <multigrid/multigrid.h>
00041 #include <multigrid/mg_dof_handler.h>
00042 #include <multigrid/mg_dof_accessor.h>
00043 #include <multigrid/mg_transfer.h>
00044 #include <multigrid/mg_tools.h>
00045 #include <multigrid/mg_coarse.h>
00046 #include <multigrid/mg_smoother.h>
00047 #include <multigrid/mg_matrix.h>
00048
00049 #include <fstream>
00050 #include <numeric>
00051
00052 #ifdef HAVE_STD_STRINGSTREAM
00053 # include <sstream>
00054 #else
00055 # include <strstream>
00056 #endif
00057
00058 #include "tools.h"
00059 #include "myfunctions.h"
00060 #include "mygrids.h"
00061 #include "playground.h"
00062 #include "compute.h"
00063
00064 #include "FeAdini/fe_adini.h"
00065 #include "FeC1/fe_c1.h"
00066
00067 using namespace dealii;
00068
00069 template <int dim>
00070 class PlateProblem
00071 {
00072
00073 public:
00074 PlateProblem (const FiniteElement<dim> &fe);
00075 void run ();
00076
00077 private:
00078 void setup_system ();
00079 void assemble_system ();
00080 void assemble_multigrid ();
00081 void solve ();
00082
00083 void derivative ();
00084 void error ();
00085 void process_solution(const unsigned int cycle,
00086 const double time_assemble_multigrid,
00087 const double time_assemble_system,
00088 const double time_of_solve);
00089 void output_results (const unsigned int cycle);
00090
00091 SmartPointer<const FiniteElement<dim> > fe;
00092 SmartPointer<const FiniteElement<dim> > fe_ref;
00093 Triangulation<dim> triangulation;
00094 Triangulation<dim> triangulation_ref;
00095 MGDoFHandler<dim> mg_dof_handler;
00096 MGDoFHandler<dim> mg_dof_handler_ref;
00097 ComputeError<dim> compute_error;
00098
00099 SparsityPattern sparsity_pattern;
00100 SparseMatrix<double> system_matrix;
00101
00102 MGLevelObject<SparsityPattern> mg_sparsity;
00103 MGLevelObject<SparseMatrix<float> > mg_matrices;
00104
00105 Playground konvergenz_tabelle;
00106 Playground aufwand_tabelle;
00107
00108 Vector<double> solution;
00109 Vector<double> solution_ref;
00110 Vector<double> solution_interpolated;
00111 Vector<double> error_of_solution;
00112 Vector<double> sol_der_x;
00113 Vector<double> sol_der_y;
00114 Vector<double> system_rhs;
00115 Vector<double> residuum;
00116 Vector<double> vector_L2_cell_error;
00117 Vector<double> vector_H1_cell_error;
00118 Vector<double> vector_H2_cell_error;
00119 Vector<double> solution_values;
00120 double L2_error_in_point, L2_error_in_point_old;
00121 double L2_error_in_midpoint, L2_error_in_midpoint_old;
00122 Tensor<1,dim> H1_error_in_point, H1_error_in_point_old;
00123 Tensor<1,dim> H1_error_in_midpoint, H1_error_in_midpoint_old;
00124 Tensor<2,dim> H2_error_in_point, H2_error_in_point_old;
00125 Tensor<2,dim> H2_error_in_midpoint, H2_error_in_midpoint_old;
00126 double global_L2_error, global_L2_error_old;
00127 double global_H1_error, global_H1_error_old;
00128 double global_H2_error, global_H2_error_old;
00129 enum FeName {fe_c1, fe_adini, fe_general_adini, fe_q};
00130 FeName fe_name;
00131 };
00132 #endif //_baerbel_plateproblem_h