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 
25 
26 #include <deal.II/grid/grid_out.h>
28 
31 
34 
36 
37 using namespace dealii;
38 
39 template <int dim>
41  : mpi_communicator(MPI_COMM_WORLD)
42  , pcout(std::cout, (Utilities::MPI::this_mpi_process(mpi_communicator) == 0))
43  , timer(pcout, TimerOutput::summary, TimerOutput::cpu_and_wall_times)
45  typename Triangulation<dim>::MeshSmoothing(
46  Triangulation<dim>::smoothing_on_refinement |
47  Triangulation<dim>::smoothing_on_coarsening))
49  , solver_control("Solver control", 1000, 1e-12, 1e-12)
50 {
51  TimerOutput::Scope timer_section(timer, "constructor");
52  add_parameter("Finite element degree", fe_degree);
53  add_parameter("Mapping degree", mapping_degree);
54  add_parameter("Number of global refinements", n_refinements);
55  add_parameter("Output filename", output_filename);
56  add_parameter("Forcing term expression", forcing_term_expression);
57  add_parameter("Dirichlet boundary condition expression",
59  add_parameter("Coefficient expression", coefficient_expression);
60  add_parameter("Number of threads", number_of_threads);
61  add_parameter("Exact solution expression", exact_solution_expression);
62  add_parameter("Neumann boundary condition expression",
64 
65  add_parameter("Local pre-refinement grid size expression",
67 
68  add_parameter("Dirichlet boundary ids", dirichlet_ids);
69  add_parameter("Neumann boundary ids", neumann_ids);
70 
71  add_parameter("Problem constants", constants);
72  add_parameter("Grid generator function", grid_generator_function);
73  add_parameter("Grid generator arguments", grid_generator_arguments);
74  add_parameter("Number of refinement cycles", n_refinement_cycles);
75 
76  add_parameter("Estimator type",
78  "",
79  this->prm,
80  Patterns::Selection("exact|kelly|residual"));
81 
82  add_parameter("Marking strategy",
84  "",
85  this->prm,
86  Patterns::Selection("global|fixed_fraction|fixed_number"));
87 
88  add_parameter("Coarsening and refinement factors",
90 
91  add_parameter("Use direct solver", use_direct_solver);
92 
93  this->prm.enter_subsection("Error table");
94  error_table.add_parameters(this->prm);
95  this->prm.leave_subsection();
96 }
97 
98 
99 template <int dim>
100 void
101 Poisson<dim>::initialize(const std::string &filename)
102 {
103  TimerOutput::Scope timer_section(timer, "initialize");
105  "last_used_parameters.prm",
107 }
108 
109 
110 
111 template <int dim>
112 void
113 Poisson<dim>::parse_string(const std::string &parameters)
114 {
115  TimerOutput::Scope timer_section(timer, "parse_string");
118 }
119 
120 
121 
122 template <int dim>
123 void
125 {
126  TimerOutput::Scope timer_section(timer, "make_grid");
127 
128  const auto vars = dim == 1 ? "x" : dim == 2 ? "x,y" : "x,y,z";
133 
134  for (unsigned int i = 0; i < n_refinements; ++i)
135  {
136  for (const auto &cell : triangulation.active_cell_iterators())
137  if (pre_refinement.value(cell->center()) < cell->diameter())
138  cell->set_refine_flag();
140  }
141 
142  std::cout << "Number of active cells: " << triangulation.n_active_cells()
143  << std::endl;
144 }
145 
146 
147 
148 template <int dim>
149 void
151 {
152  TimerOutput::Scope timer_section(timer, "refine_grid");
153  // Cells have been marked in the mark() method.
155 }
156 
157 
158 
159 template <int dim>
160 void
162 {
163  TimerOutput::Scope timer_section(timer, "setup_system");
164  if (!fe)
165  {
166  fe = std::make_unique<FE_Q<dim>>(fe_degree);
167  mapping = std::make_unique<MappingQGeneric<dim>>(mapping_degree);
168  const auto vars = dim == 1 ? "x" : dim == 2 ? "x,y" : "x,y,z";
172 
173  dirichlet_boundary_condition.initialize(
175 
176  neumann_boundary_condition.initialize(
178  }
179 
181 
184 
185  pcout << "Number of degrees of freedom: " << dof_handler.n_dofs()
186  << std::endl;
187 
188 
189  constraints.clear();
192 
193  for (const auto &id : dirichlet_ids)
196  constraints.close();
197 
198 
205 
206 
209  dsp,
211 
214 
218 
220 }
221 
222 
223 
224 template <int dim>
225 void
227  const typename DoFHandler<dim>::active_cell_iterator &cell,
228  ScratchData & scratch,
229  CopyData & copy)
230 {
231  auto &cell_matrix = copy.matrices[0];
232  auto &cell_rhs = copy.vectors[0];
233 
234  cell->get_dof_indices(copy.local_dof_indices[0]);
235 
236  const auto &fe_values = scratch.reinit(cell);
237  cell_matrix = 0;
238  cell_rhs = 0;
239 
240  for (const unsigned int q_index : fe_values.quadrature_point_indices())
241  {
242  for (const unsigned int i : fe_values.dof_indices())
243  for (const unsigned int j : fe_values.dof_indices())
244  cell_matrix(i, j) +=
245  (coefficient.value(fe_values.quadrature_point(q_index)) * // a(x_q)
246  fe_values.shape_grad(i, q_index) * // grad phi_i(x_q)
247  fe_values.shape_grad(j, q_index) * // grad phi_j(x_q)
248  fe_values.JxW(q_index)); // dx
249  for (const unsigned int i : fe_values.dof_indices())
250  cell_rhs(i) +=
251  (fe_values.shape_value(i, q_index) * // phi_i(x_q)
252  forcing_term.value(fe_values.quadrature_point(q_index)) * // f(x_q)
253  fe_values.JxW(q_index)); // dx
254  }
255 
256  if (cell->at_boundary())
257  // for(const auto face: cell->face_indices())
258  for (unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell; ++f)
259  if (neumann_ids.find(cell->face(f)->boundary_id()) != neumann_ids.end())
260  {
261  auto &fe_face_values = scratch.reinit(cell, f);
262  for (const unsigned int q_index :
263  fe_face_values.quadrature_point_indices())
264  for (const unsigned int i : fe_face_values.dof_indices())
265  cell_rhs(i) += fe_face_values.shape_value(i, q_index) *
267  fe_face_values.quadrature_point(q_index)) *
268  fe_face_values.JxW(q_index);
269  }
270 }
271 
272 
273 
274 template <int dim>
275 void
277 {
279  copy.vectors[0],
280  copy.local_dof_indices[0],
282  system_rhs);
283 }
284 
285 
286 
287 template <int dim>
288 void
292 {
293  QGauss<dim> quadrature_formula(fe->degree + 1);
294  QGauss<dim - 1> face_quadrature_formula(fe->degree + 1);
295 
296  ScratchData scratch(*mapping,
297  *fe,
298  quadrature_formula,
301  face_quadrature_formula,
304 
306 
307  static Threads::Mutex assemble_mutex;
308 
309  for (auto cell = begin; cell != end; ++cell)
310  {
311  assemble_system_one_cell(cell, scratch, copy);
312  assemble_mutex.lock();
314  assemble_mutex.unlock();
315  }
316 }
317 
318 
319 
320 template <int dim>
321 void
323 {
324  TimerOutput::Scope timer_section(timer, "assemble_system");
325  QGauss<dim> quadrature_formula(fe->degree + 1);
326  QGauss<dim - 1> face_quadrature_formula(fe->degree + 1);
327 
328  ScratchData scratch(*mapping,
329  *fe,
330  quadrature_formula,
331  update_values | update_gradients |
332  update_quadrature_points | update_JxW_values,
333  face_quadrature_formula,
334  update_values | update_quadrature_points |
335  update_JxW_values);
336 
338 
339 
340  for (const auto &cell : dof_handler.active_cell_iterators())
341  if (cell->is_locally_owned())
342  {
343  assemble_system_one_cell(cell, scratch, copy);
344  copy_one_cell(copy);
345  }
346 
347 
350 }
351 
352 
353 
354 template <int dim>
355 void
357 {
358  TimerOutput::Scope timer_section(timer, "solve");
359  // if (use_direct_solver == true)
360  // {
361  // SparseDirectUMFPACK system_matrix_inverse;
362  // system_matrix_inverse.initialize(system_matrix);
363  // system_matrix_inverse.vmult(solution, system_rhs);
364  // }
365  // else
366  // {
368  LA::MPI::PreconditionAMG amg;
369  amg.initialize(system_matrix);
370  solver.solve(system_matrix, solution, system_rhs, amg);
372 
374 }
375 
376 
377 
378 template <int dim>
379 void
381 {
382  TimerOutput::Scope timer_section(timer, "estimate");
383  if (estimator_type == "exact")
384  {
385  error_per_cell = 0;
386  QGauss<dim> quad(fe->degree + 1);
388  dof_handler,
392  quad,
394  }
395  else if (estimator_type == "kelly")
396  {
397  std::map<types::boundary_id, const Function<dim> *> neumann;
398  for (const auto id : neumann_ids)
399  neumann[id] = &neumann_boundary_condition;
400 
401  QGauss<dim - 1> face_quad(fe->degree + 1);
403  dof_handler,
404  face_quad,
405  neumann,
408  ComponentMask(),
409  &coefficient);
410  }
411  else if (estimator_type == "residual")
412  {
413  // h_T || f+\Delta u_h ||_0,T
414  // + \sum over faces
415  // 1/2 (h_F)^{1/2} || [n.\nabla u_h] ||_0,F
416 
417  QGauss<dim - 1> face_quad(fe->degree + 1);
418  QGauss<dim> quad(fe->degree + 1);
419 
420  std::map<types::boundary_id, const Function<dim> *> neumann;
421  for (const auto id : neumann_ids)
422  neumann[id] = &neumann_boundary_condition;
423 
425  dof_handler,
426  face_quad,
427  neumann,
430  ComponentMask(),
431  &coefficient);
432 
433  FEValues<dim> fe_values(*mapping,
434  *fe,
435  quad,
438 
439  std::vector<double> local_laplacians(quad.size());
440 
441 
442  double residual_L2_norm = 0;
443 
444  unsigned int cell_index = 0;
445  for (const auto &cell : dof_handler.active_cell_iterators())
446  {
447  fe_values.reinit(cell);
448 
450  local_laplacians);
451  residual_L2_norm = 0;
452  for (const auto q_index : fe_values.quadrature_point_indices())
453  {
454  const auto arg =
455  (local_laplacians[q_index] +
456  forcing_term.value(fe_values.quadrature_point(q_index)));
457  residual_L2_norm += arg * arg * fe_values.JxW(q_index);
458  }
460  cell->diameter() * std::sqrt(residual_L2_norm);
461 
462  ++cell_index;
463  }
464  }
465  else
466  {
467  AssertThrow(false, ExcNotImplemented());
468  }
469  auto global_estimator = error_per_cell.l2_norm();
470  error_table.add_extra_column("estimator", [global_estimator]() {
471  return global_estimator;
472  });
474  dof_handler,
477 }
478 
479 
480 
481 template <int dim>
482 void
484 {
485  TimerOutput::Scope timer_section(timer, "mark");
486  if (marking_strategy == "global")
487  {
488  for (const auto &cell : triangulation.active_cell_iterators())
489  cell->set_refine_flag();
490  }
491  else if (marking_strategy == "fixed_fraction")
492  {
498  }
499  else if (marking_strategy == "fixed_number")
500  {
506  }
507  else
508  {
509  Assert(false, ExcInternalError());
510  }
511 }
512 
513 template <int dim>
514 void
515 Poisson<dim>::output_results(const unsigned cycle) const
516 {
517  TimerOutput::Scope timer_section(timer, "output_results");
518  DataOut<dim> data_out;
520  flags.write_higher_order_cells = true;
521  data_out.set_flags(flags);
523  data_out.add_data_vector(locally_relevant_solution, "solution");
524  // auto interpolated_exact = solution;
525  // VectorTools::interpolate(*mapping,
526  // dof_handler,
527  // exact_solution,
528  // interpolated_exact);
529  // auto locally_interpolated_exact = interpolated_exact;
530 
531  // data_out.add_data_vector(interpolated_exact, "exact");
532  data_out.add_data_vector(error_per_cell, "estimator");
533  data_out.build_patches(*mapping,
536  std::string fname = output_filename + "_" + std::to_string(cycle) + ".vtu";
537  data_out.write_vtu_in_parallel(fname, mpi_communicator);
538 
539  GridOut go;
541  "tria_" + std::to_string(cycle),
542  false,
543  true);
544 }
545 
546 
547 
548 template <int dim>
549 void
551 {
552  if (number_of_threads != -1 && number_of_threads > 0)
554  static_cast<unsigned int>(number_of_threads));
555 
556  std::cout << "Number of cores : " << MultithreadInfo::n_cores() << std::endl
557  << "Number of threads: " << MultithreadInfo::n_threads()
558  << std::endl;
559 }
560 
561 
562 
563 template <int dim>
564 void
566 {
568  make_grid();
569  for (unsigned int cycle = 0; cycle < n_refinement_cycles; ++cycle)
570  {
571  setup_system();
572  assemble_system();
573  solve();
574  estimate();
576  if (cycle < n_refinement_cycles - 1)
577  {
578  mark();
579  refine_grid();
580  }
581  }
582  if (pcout.is_active())
583  error_table.output_table(std::cout);
584 }
585 
586 template class Poisson<1>;
587 template class Poisson<2>;
588 template class Poisson<3>;
FEValues< dim, spacedim >::shape_value
const double & shape_value(const unsigned int function_no, const unsigned int point_no) const
ParameterAcceptor::parse_all_parameters
static void parse_all_parameters(ParameterHandler &prm=ParameterAcceptor::prm)
Poisson::estimate
void estimate()
Definition: poisson.cc:380
work_stream.h
Poisson::locally_owned_dofs
IndexSet locally_owned_dofs
Definition: poisson.h:165
cycle
unsigned int cycle
FEValues::reinit
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access >> &cell)
Poisson::marking_strategy
std::string marking_strategy
Definition: poisson.h:176
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
update_quadrature_points
update_quadrature_points
MeshWorker::CopyData
Triangulation::active_cell_iterators
IteratorRange< active_cell_iterator > active_cell_iterators() const
Poisson::dof_handler
DoFHandler< 2 > dof_handler
Definition: poisson.h:76
SolverCG
TimerOutput
Poisson::estimator_type
std::string estimator_type
Definition: poisson.h:175
Triangulation::execute_coarsening_and_refinement
virtual void execute_coarsening_and_refinement()
MultithreadInfo::n_threads
static unsigned int n_threads()
Poisson::error_table
ParsedConvergenceTable error_table
Definition: poisson.h:119
Threads::Mutex
dealii
FEValues::quadrature_point_indices
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
ExcNotImplemented
static ::ExceptionBase & ExcNotImplemented()
parallel::distributed::GridRefinement::refine_and_coarsen_fixed_number
void refine_and_coarsen_fixed_number(parallel::distributed::Triangulation< dim, spacedim > &tria, const ::Vector< Number > &criteria, const double top_fraction_of_cells, const double bottom_fraction_of_cells, const types::global_cell_index max_n_cells=std::numeric_limits< types::global_cell_index >::max())
Poisson::locally_relevant_solution
LA::MPI::Vector locally_relevant_solution
Definition: poisson.h:169
Poisson::system_matrix
SparseMatrix< double > system_matrix
Definition: poisson.h:78
error_estimator.h
Poisson::Poisson
Poisson()
Definition: poisson.cc:24
Poisson::initialize
void initialize(const std::string &filename)
Definition: poisson.cc:53
Poisson::locally_relevant_dofs
IndexSet locally_relevant_dofs
Definition: poisson.h:166
grid_refinement.h
flags
DataOutBase::DataOutFilterFlags flags
Poisson::CopyData
MeshWorker::CopyData< 1, 1, 1 > CopyData
Definition: poisson.h:113
Poisson::assemble_system_one_cell
void assemble_system_one_cell(const typename DoFHandler< dim >::active_cell_iterator &cell, ScratchData &scratch, CopyData &copy)
Definition: poisson.cc:226
FEValues::get_function_laplacians
void get_function_laplacians(const InputVector &fe_function, std::vector< typename InputVector::value_type > &laplacians) const
VectorTools::integrate_difference
void integrate_difference(const Mapping< dim, spacedim > &mapping, const DoFHandler< dim, spacedim > &dof, const InVector &fe_function, const Function< spacedim, typename InVector::value_type > &exact_solution, OutVector &difference, const Quadrature< dim > &q, const NormType &norm, const Function< spacedim, double > *weight=nullptr, const double exponent=2.)
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
VectorOperation::add
add
ComponentMask
e
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Poisson::fe
FE_Q< 2 > fe
Definition: poisson.h:75
Poisson::pcout
ConditionalOStream pcout
Definition: poisson.h:155
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.)
update_values
update_values
ParsedConvergenceTable::add_extra_column
void add_extra_column(const std::string &column_name, const std::function< double()> &custom_function, const bool compute_rate=true)
grid_out.h
Poisson::n_refinement_cycles
unsigned int n_refinement_cycles
Definition: poisson.h:105
begin
iterator begin()
constraints
AffineConstraints< double > constraints
DataOut::attach_dof_handler
void attach_dof_handler(const DoFHandler< dim, spacedim > &)
DoFHandler
MultithreadInfo::n_cores
static unsigned int n_cores()
thread_management.h
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)
MeshWorker::ScratchData::reinit
const FEValues< dim, spacedim > & reinit(const typename DoFHandler< dim, spacedim >::active_cell_iterator &cell)
FE_Q::degree
const unsigned int degree
Poisson::print_system_info
void print_system_info()
Definition: poisson.cc:550
DoFHandler::locally_owned_dofs
const IndexSet & locally_owned_dofs() const
max
max
SparseMatrix< double >::compress
void compress(::VectorOperation::values)
Triangulation
trilinos_precondition.h
cell_index
unsigned int cell_index
Poisson::exact_solution
FunctionParser< dim > exact_solution
Definition: poisson.h:182
MeshWorker::ScratchData
Poisson::mapping
std::unique_ptr< MappingQGeneric< dim > > mapping
Definition: poisson.h:160
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
Poisson::ScratchData
MeshWorker::ScratchData< dim > ScratchData
Definition: poisson.h:114
sparse_direct.h
KellyErrorEstimator::estimate
static void estimate(const Mapping< dim, spacedim > &mapping, const DoFHandler< dim, spacedim > &dof, const Quadrature< dim - 1 > &quadrature, const std::map< types::boundary_id, const Function< spacedim, typename InputVector::value_type > * > &neumann_bc, const InputVector &solution, Vector< float > &error, const ComponentMask &component_mask=ComponentMask(), const Function< spacedim > *coefficients=nullptr, const unsigned int n_threads=numbers::invalid_unsigned_int, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id, const types::material_id material_id=numbers::invalid_material_id, const Strategy strategy=cell_diameter_over_24)
Poisson::pre_refinement_expression
std::string pre_refinement_expression
Definition: poisson.h:203
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)
Poisson::number_of_threads
int number_of_threads
Definition: poisson.h:193
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
Poisson::use_direct_solver
bool use_direct_solver
Definition: poisson.h:211
SparseMatrix< double >::reinit
virtual void reinit(const SparsityPattern &sparsity)
Poisson::mapping_degree
unsigned int mapping_degree
Definition: poisson.h:189
Poisson::neumann_boundary_conditions_expression
std::string neumann_boundary_conditions_expression
Definition: poisson.h:113
Poisson::error_per_cell
Vector< float > error_per_cell
Definition: poisson.h:174
multithread_info.h
DataOut::build_patches
virtual void build_patches(const unsigned int n_subdivisions=0)
Poisson::coefficient_expression
std::string coefficient_expression
Definition: poisson.h:199
update_gradients
update_gradients
DoFTools::extract_locally_relevant_dofs
IndexSet extract_locally_relevant_dofs(const DoFHandler< dim, spacedim > &dof_handler)
Poisson::assemble_system_on_range
void assemble_system_on_range(const typename DoFHandler< dim >::active_cell_iterator &begin, const typename DoFHandler< dim >::active_cell_iterator &end)
Definition: poisson.cc:289
Poisson::mpi_communicator
MPI_Comm mpi_communicator
Definition: poisson.h:153
GridOut::write_mesh_per_processor_as_vtu
void write_mesh_per_processor_as_vtu(const Triangulation< dim, spacedim > &tria, const std::string &filename_without_extension, const bool view_levels=false, const bool include_artificial=false) const
Poisson::coarsening_and_refinement_factors
std::pair< double, double > coarsening_and_refinement_factors
Definition: poisson.h:177
parameters
BaseClass::AdditionalData parameters
to_string
static std::string to_string(const T &s, const Patterns::PatternBase &p=*Convert< T >::to_pattern())=delete
DynamicSparsityPattern
Vector< double >::compress
void compress(::VectorOperation::values operation=::VectorOperation::unknown) const
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
copy_data.h
FEValues::JxW
double JxW(const unsigned int quadrature_point) const
ParameterAcceptor::prm
static ParameterHandler prm
make_grid
void make_grid(Triangulation< 2 > &triangulation)
Definition: step-2.cc:41
Vector< double >::reinit
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
ParsedConvergenceTable::add_parameters
void add_parameters(ParameterHandler &prm)
AffineConstraints< double >::reinit
void reinit(const IndexSet &local_constraints=IndexSet())
Poisson::solution
Vector< double > solution
Definition: poisson.h:79
DataOutBase::VtkFlags
QGauss
ExcInternalError
static ::ExceptionBase & ExcInternalError()
update_JxW_values
update_JxW_values
Poisson::exact_solution_expression
std::string exact_solution_expression
Definition: poisson.h:200
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()
Assert
#define Assert(cond, exc)
scratch_data.h
update_hessians
update_hessians
this_mpi_process
unsigned int this_mpi_process(const MPI_Comm &mpi_communicator)
vars
std::vector< double > vars
Poisson::setup_system
void setup_system()
Definition: poisson.cc:43
VectorTools::H1_seminorm
H1_seminorm
ParameterHandler::Short
Short
Poisson::n_refinements
unsigned int n_refinements
Definition: poisson.h:104
DataOut::set_flags
void set_flags(const FlagType &flags)
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
SparsityTools::distribute_sparsity_pattern
void distribute_sparsity_pattern(DynamicSparsityPattern &dsp, const IndexSet &locally_owned_rows, const MPI_Comm &mpi_comm, const IndexSet &locally_relevant_rows)
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
FEValues::quadrature_point
const Point< spacedim > & quadrature_point(const unsigned int q) const
QGauss::size
unsigned int size() const
Poisson::solver_control
ParameterAcceptorProxy< ReductionControl > solver_control
Definition: poisson.h:213
Vector::l2_norm
real_type l2_norm() const
end
iterator end()
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
Poisson::coefficient
FunctionParser< dim > coefficient
Definition: poisson.h:181
Poisson::copy_one_cell
void copy_one_cell(const CopyData &copy)
Definition: poisson.cc:276
Patterns::Selection
DoFHandler::active_cell_iterators
IteratorRange< active_cell_iterator > active_cell_iterators() const
Poisson::mark
void mark()
Definition: poisson.cc:483
parallel::distributed::GridRefinement::refine_and_coarsen_fixed_fraction
void refine_and_coarsen_fixed_fraction(parallel::distributed::Triangulation< dim, spacedim > &tria, const ::Vector< Number > &criteria, const double top_fraction_of_error, const double bottom_fraction_of_error, const VectorTools::NormType norm_type=VectorTools::NormType::L1_norm)
DataOut::write_vtu_in_parallel
void write_vtu_in_parallel(const std::string &filename, const MPI_Comm &comm) const
GridOut
FE_Q::n_dofs_per_cell
unsigned int n_dofs_per_cell() const
DataOut< dim >
Poisson::pre_refinement
FunctionParser< dim > pre_refinement
Definition: poisson.h:185
Poisson::assemble_system
void assemble_system()
Definition: poisson.cc:59
AffineConstraints< double >::close
void close()
AssertThrow
#define AssertThrow(cond, exc)
constants
std::map< std::string, double > constants
Utilities
Poisson::dirichlet_boundary_conditions_expression
std::string dirichlet_boundary_conditions_expression
Definition: poisson.h:112
copy
void copy(const T *begin, const T *end, U *dest)
Poisson::timer
TimerOutput timer
Definition: poisson.h:156
MultithreadInfo::set_thread_limit
static void set_thread_limit(const unsigned int max_threads=numbers::invalid_unsigned_int)
DoFHandler::n_dofs
types::global_dof_index n_dofs() const
ConditionalOStream::is_active
bool is_active() const