The finite element method using deal.II - 2021/2022
poisson.cc
Go to the documentation of this file.
1 /* ---------------------------------------------------------------------
2  *
3  * Copyright (C) 1999 - 2020 by the deal.II authors
4  *
5  * This file is part of the deal.II library.
6  *
7  * The deal.II library is free software; you can use it, redistribute
8  * it, and/or modify it under the terms of the GNU Lesser General
9  * Public License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  * The full text of the license can be found in the file LICENSE.md at
12  * the top level directory of deal.II.
13  *
14  * ---------------------------------------------------------------------
15  *
16  * Authors: Wolfgang Bangerth, 1999,
17  * Guido Kanschat, 2011
18  * Luca Heltai, 2021
19  */
20 #include "poisson.h"
21 
22 using namespace dealii;
23 
24 template <int dim>
27 {
28  add_parameter("Finite element degree", fe_degree);
29  add_parameter("Number of global refinements", n_refinements);
30  add_parameter("Output filename", output_filename);
31  add_parameter("Forcing term expression", forcing_term_expression);
32  add_parameter("Dirichlet boundary condition expression",
34  add_parameter("Neumann boundary condition expression",
36 
37  add_parameter("Dirichlet boundary ids", dirichlet_ids);
38  add_parameter("Neumann boundary ids", neumann_ids);
39 
40  add_parameter("Problem constants", constants);
41  add_parameter("Grid generator function", grid_generator_function);
42  add_parameter("Grid generator arguments", grid_generator_arguments);
43  add_parameter("Number of refinement cycles", n_refinement_cycles);
44 
45  this->prm.enter_subsection("Error table");
46  error_table.add_parameters(this->prm);
47  this->prm.leave_subsection();
48 }
49 
50 
51 template <int dim>
52 void
53 Poisson<dim>::initialize(const std::string &filename)
54 {
56 }
57 
58 
59 
60 template <int dim>
61 void
63 {
66 }
67 
68 
69 
70 template <int dim>
71 void
73 {
78  std::cout << "Number of active cells: " << triangulation.n_active_cells()
79  << std::endl;
80 }
81 
82 
83 
84 template <int dim>
85 void
87 {
89 }
90 
91 
92 
93 template <int dim>
94 void
96 {
97  if (!fe)
98  {
99  fe = std::make_unique<FE_Q<dim>>(fe_degree);
100  forcing_term.initialize(dim == 1 ? "x" :
101  dim == 2 ? "x,y" :
102  "x,y,z",
104  constants);
105  dirichlet_boundary_condition.initialize(
106  dim == 1 ? "x" :
107  dim == 2 ? "x,y" :
108  "x,y,z",
110  constants);
111 
112  neumann_boundary_condition.initialize(
113  dim == 1 ? "x" :
114  dim == 2 ? "x,y" :
115  "x,y,z",
117  constants);
118  }
119 
121  std::cout << "Number of degrees of freedom: " << dof_handler.n_dofs()
122  << std::endl;
123  constraints.clear();
125 
126  for (const auto &id : dirichlet_ids)
128  id,
130  constraints);
131  constraints.close();
132 
133 
140 }
141 
142 
143 
144 template <int dim>
145 void
147 {
148  QGauss<dim> quadrature_formula(fe->degree + 1);
149  QGauss<dim - 1> face_quadrature_formula(fe->degree + 1);
150 
151  FEValues<dim> fe_values(*fe,
152  quadrature_formula,
153  update_values | update_gradients |
154  update_quadrature_points | update_JxW_values);
155 
156  FEFaceValues<dim> fe_face_values(*fe,
157  face_quadrature_formula,
158  update_values | update_quadrature_points |
159  update_JxW_values);
160 
161  const unsigned int dofs_per_cell = fe->n_dofs_per_cell();
162  FullMatrix<double> cell_matrix(dofs_per_cell, dofs_per_cell);
163  Vector<double> cell_rhs(dofs_per_cell);
164  std::vector<types::global_dof_index> local_dof_indices(dofs_per_cell);
165  for (const auto &cell : dof_handler.active_cell_iterators())
166  {
167  fe_values.reinit(cell);
168  cell_matrix = 0;
169  cell_rhs = 0;
170  for (const unsigned int q_index : fe_values.quadrature_point_indices())
171  {
172  for (const unsigned int i : fe_values.dof_indices())
173  for (const unsigned int j : fe_values.dof_indices())
174  cell_matrix(i, j) +=
175  (fe_values.shape_grad(i, q_index) * // grad phi_i(x_q)
176  fe_values.shape_grad(j, q_index) * // grad phi_j(x_q)
177  fe_values.JxW(q_index)); // dx
178  for (const unsigned int i : fe_values.dof_indices())
179  cell_rhs(i) += (fe_values.shape_value(i, q_index) * // phi_i(x_q)
180  forcing_term.value(
181  fe_values.quadrature_point(q_index)) * // f(x_q)
182  fe_values.JxW(q_index)); // dx
183  }
184 
185  if (cell->at_boundary())
186  // for(const auto face: cell->face_indices())
187  for (unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell; ++f)
188  if (neumann_ids.find(cell->face(f)->boundary_id()) !=
189  neumann_ids.end())
190  {
191  fe_face_values.reinit(cell, f);
192  for (const unsigned int q_index :
193  fe_face_values.quadrature_point_indices())
194  for (const unsigned int i : fe_face_values.dof_indices())
195  cell_rhs(i) += fe_face_values.shape_value(i, q_index) *
197  fe_face_values.quadrature_point(q_index)) *
198  fe_face_values.JxW(q_index);
199  }
200 
201  cell->get_dof_indices(local_dof_indices);
203  cell_matrix, cell_rhs, local_dof_indices, system_matrix, system_rhs);
204  }
205 }
206 
207 
208 
209 template <int dim>
210 void
212 {
213  SolverControl solver_control(1000, 1e-12);
217 }
218 
219 
220 
221 template <int dim>
222 void
223 Poisson<dim>::output_results(const unsigned cycle) const
224 {
225  DataOut<dim> data_out;
227  data_out.add_data_vector(solution, "solution");
228  data_out.build_patches();
229  std::string fname = output_filename + "_" + std::to_string(cycle) + ".vtu";
230  std::ofstream output(fname);
231  data_out.write_vtu(output);
232 }
233 
234 
235 
236 template <int dim>
237 void
239 {
240  make_grid();
241  for (unsigned int cycle = 0; cycle < n_refinement_cycles; ++cycle)
242  {
243  setup_system();
244  assemble_system();
245  solve();
247  solution,
250  if (cycle < n_refinement_cycles - 1)
251  refine_grid();
252  }
253  error_table.output_table(std::cout);
254 }
255 
256 template class Poisson<1>;
257 template class Poisson<2>;
258 template class Poisson<3>;
ParameterAcceptor::parse_all_parameters
static void parse_all_parameters(ParameterHandler &prm=ParameterAcceptor::prm)
local_dof_indices
std::vector< types::global_dof_index > local_dof_indices
cycle
unsigned int cycle
Poisson::grid_generator_function
std::string grid_generator_function
Definition: poisson.h:116
Poisson::forcing_term_expression
std::string forcing_term_expression
Definition: poisson.h:111
DataOut::write_vtu
void write_vtu(std::ostream &out) const
Poisson::dof_handler
DoFHandler< 2 > dof_handler
Definition: poisson.h:76
SolverCG
PreconditionIdentity
PreconditionIdentity()
SolverControl
Poisson::error_table
ParsedConvergenceTable error_table
Definition: poisson.h:119
dealii
Poisson::system_matrix
SparseMatrix< double > system_matrix
Definition: poisson.h:78
Poisson::Poisson
Poisson()
Definition: poisson.cc:24
Triangulation::refine_global
void refine_global(const unsigned int times=1)
Poisson::initialize
void initialize(const std::string &filename)
Definition: poisson.cc:53
Poisson::system_rhs
Vector< double > system_rhs
Definition: poisson.h:80
Poisson::run
void run()
Definition: poisson.cc:133
Poisson::solve
void solve()
Definition: poisson.cc:110
Poisson::fe
FE_Q< 2 > fe
Definition: poisson.h:75
cell_matrix
void cell_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, const FEValuesBase< dim > &fetest, const ArrayView< const std::vector< double >> &velocity, const double factor=1.)
Poisson::n_refinement_cycles
unsigned int n_refinement_cycles
Definition: poisson.h:105
constraints
AffineConstraints< double > constraints
DataOut::attach_dof_handler
void attach_dof_handler(const DoFHandler< dim, spacedim > &)
Poisson::neumann_boundary_condition
FunctionParser< dim > neumann_boundary_condition
Definition: poisson.h:100
DoFHandler::distribute_dofs
void distribute_dofs(const FiniteElement< dim, spacedim > &fe)
DoFTools::make_hanging_node_constraints
void make_hanging_node_constraints(const DoFHandler< dim, spacedim > &dof_handler, AffineConstraints< number > &constraints)
FEValues< dim >
ParsedConvergenceTable::error_from_exact
void error_from_exact(const DoFHandler< dim, spacedim > &vspace, const VectorType &solution, const Function< spacedim > &exact, const Function< spacedim > *weight=nullptr)
FE_Q::degree
const unsigned int degree
AffineConstraints< double >::distribute_local_to_global
void distribute_local_to_global(const InVector &local_vector, const std::vector< size_type > &local_dof_indices, OutVector &global_vector) const
Poisson::refine_grid
void refine_grid()
Definition: poisson.cc:86
ParsedConvergenceTable::output_table
void output_table(std::ostream &out)
DoFTools::make_sparsity_pattern
void make_sparsity_pattern(const DoFHandler< dim, spacedim > &dof_handler, SparsityPatternType &sparsity_pattern, const AffineConstraints< number > &constraints=AffineConstraints< number >(), const bool keep_constrained_dofs=true, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id)
ParameterAcceptor::initialize
static void initialize(const std::string &filename="", const std::string &output_filename="", const ParameterHandler::OutputStyle output_style_for_output_filename=ParameterHandler::Short, ParameterHandler &prm=ParameterAcceptor::prm, const ParameterHandler::OutputStyle output_style_for_filename=ParameterHandler::DefaultStyle)
Poisson::output_filename
std::string output_filename
Definition: poisson.h:106
SparseMatrix< double >::reinit
virtual void reinit(const SparsityPattern &sparsity)
Poisson::neumann_boundary_conditions_expression
std::string neumann_boundary_conditions_expression
Definition: poisson.h:113
DataOut::build_patches
virtual void build_patches(const unsigned int n_subdivisions=0)
sparsity_pattern
SparsityPattern sparsity_pattern
parameters
BaseClass::AdditionalData parameters
to_string
static std::string to_string(const T &s, const Patterns::PatternBase &p=*Convert< T >::to_pattern())=delete
DynamicSparsityPattern
VectorTools::interpolate_boundary_values
void interpolate_boundary_values(const Mapping< dim, spacedim > &mapping, const DoFHandler< dim, spacedim > &dof, const std::map< types::boundary_id, const Function< spacedim, number > * > &function_map, std::map< types::global_dof_index, number > &boundary_values, const ComponentMask &component_mask=ComponentMask())
Poisson::make_grid
void make_grid()
Definition: poisson.cc:32
ParameterAcceptor::prm
static ParameterHandler prm
make_grid
void make_grid(Triangulation< 2 > &triangulation)
Definition: step-2.cc:41
output
output
Vector< double >::reinit
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
ParsedConvergenceTable::add_parameters
void add_parameters(ParameterHandler &prm)
Poisson::solution
Vector< double > solution
Definition: poisson.h:79
QGauss
AffineConstraints< double >::distribute
void distribute(VectorType &vec) const
Poisson::parse_string
void parse_string(const std::string &par)
Definition: poisson.cc:62
AffineConstraints< double >::clear
void clear()
Poisson::setup_system
void setup_system()
Definition: poisson.cc:43
SparsityPattern::copy_from
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end)
Poisson::n_refinements
unsigned int n_refinements
Definition: poisson.h:104
Poisson::fe_degree
unsigned int fe_degree
Definition: poisson.h:103
Poisson::grid_generator_arguments
std::string grid_generator_arguments
Definition: poisson.h:117
Poisson::neumann_ids
std::set< types::boundary_id > neumann_ids
Definition: poisson.h:109
Poisson::output_results
void output_results() const
Definition: poisson.cc:120
DataOut::add_data_vector
void add_data_vector(const VectorType &data, const std::vector< std::string > &names, const DataVectorType type=type_automatic, const std::vector< DataComponentInterpretation::DataComponentInterpretation > &data_component_interpretation={})
Poisson::triangulation
Triangulation< 2 > triangulation
Definition: poisson.h:74
ParameterHandler::parse_input_from_string
virtual void parse_input_from_string(const std::string &s, const std::string &last_line="", const bool skip_undefined=false)
Poisson::forcing_term
FunctionParser< dim > forcing_term
Definition: poisson.h:98
Poisson::dirichlet_boundary_condition
FunctionParser< dim > dirichlet_boundary_condition
Definition: poisson.h:99
Poisson
Solve the Poisson problem, with Dirichlet or Neumann boundary conditions, on all geometries that can ...
Definition: poisson.h:55
Triangulation::n_active_cells
unsigned int n_active_cells() const
Poisson::dirichlet_ids
std::set< types::boundary_id > dirichlet_ids
Definition: poisson.h:108
Poisson::solver_control
ParameterAcceptorProxy< ReductionControl > solver_control
Definition: poisson.h:213
FullMatrix< double >
GridGenerator::generate_from_name_and_arguments
void generate_from_name_and_arguments(Triangulation< dim, spacedim > &tria, const std::string &grid_generator_function_name, const std::string &grid_generator_function_arguments)
Poisson::constants
std::map< std::string, double > constants
Definition: poisson.h:114
FEFaceValues< dim >
DoFHandler::active_cell_iterators
IteratorRange< active_cell_iterator > active_cell_iterators() const
FE_Q::n_dofs_per_cell
unsigned int n_dofs_per_cell() const
DataOut< dim >
Poisson::assemble_system
void assemble_system()
Definition: poisson.cc:59
Vector< double >
AffineConstraints< double >::close
void close()
constants
std::map< std::string, double > constants
Poisson::dirichlet_boundary_conditions_expression
std::string dirichlet_boundary_conditions_expression
Definition: poisson.h:112
DoFHandler::n_dofs
types::global_dof_index n_dofs() const