28 template <
int dim,
int spacedim>
31 , grid_generator(
"/Poisson/Grid")
32 , grid_refinement(
"/Poisson/Grid/Refinement")
33 , finite_element(
"/Poisson/",
"u",
"FE_Q(1)")
36 , preconditioner(
"/Poisson/Solver/AMG Preconditioner")
37 , constants(
"/Poisson/Constants",
40 {
"Diffusion coefficient"})
41 , forcing_term(
"/Poisson/Functions",
42 "kappa*8*PI^2*sin(2*PI*x)*sin(2*PI*y)",
44 , exact_solution(
"/Poisson/Functions",
45 "sin(2*PI*x)*sin(2*PI*y)",
47 , boundary_conditions(
"/Poisson/Boundary conditions")
48 , error_table(
"/Poisson/Error table")
49 , data_out(
"/Poisson/Output")
51 add_parameter(
"Console level", this->console_level);
56 template <
int dim,
int spacedim>
60 deallog <<
"System setup" << std::endl;
64 ref_cells.size() == 1,
66 "This program does nots support mixed simplx/hex grid types."));
70 ExcMessage(
"The finite element must be defined on the same "
71 "cell type as the grid."));
75 boundary_conditions.update_user_substitution_map(constants);
76 exact_solution.update_constants(constants);
77 forcing_term.update_constants(constants);
79 dof_handler.distribute_dofs(finite_element);
87 deallog <<
"Number of dofs " << dof_handler.n_dofs() << std::endl;
110 boundary_conditions.apply_essential_boundary_conditions(*mapping,
118 sparsity_pattern.copy_from(dsp);
119 system_matrix.reinit(sparsity_pattern);
120 solution.reinit(dof_handler.n_dofs());
121 system_rhs.reinit(dof_handler.n_dofs());
127 boundary_conditions.apply_natural_boundary_conditions(
128 *mapping, dof_handler, constraints, system_matrix, system_rhs);
133 template <
int dim,
int spacedim>
137 deallog <<
"Assemble system" << std::endl;
138 const ReferenceCell cell_type = finite_element().reference_cell();
146 finite_element().tensor_degree() + 1);
158 const unsigned int dofs_per_cell = finite_element().n_dofs_per_cell();
161 std::vector<types::global_dof_index> local_dof_indices(dofs_per_cell);
162 for (
const auto &cell : dof_handler.active_cell_iterators())
164 fe_values.reinit(cell);
167 for (
const unsigned int q_index :
168 fe_values.quadrature_point_indices())
170 for (
const unsigned int i : fe_values.dof_indices())
171 for (
const unsigned int j : fe_values.dof_indices())
173 (constants[
"kappa"] *
174 fe_values.shape_grad(i, q_index) *
175 fe_values.shape_grad(j, q_index) *
176 fe_values.JxW(q_index));
177 for (
const unsigned int i : fe_values.dof_indices())
179 (fe_values.shape_value(i, q_index) *
181 fe_values.quadrature_point(q_index)) *
182 fe_values.JxW(q_index));
185 cell->get_dof_indices(local_dof_indices);
186 constraints.distribute_local_to_global(cell_matrix,
199 template <
int dim,
int spacedim>
203 deallog <<
"Solve system" << std::endl;
204 preconditioner.initialize(system_matrix);
205 const auto A = linear_operator<Vector<double>>(system_matrix);
207 solution = Ainv * system_rhs;
208 constraints.distribute(solution);
226 template <
int dim,
int spacedim>
230 deallog <<
"Output results" << std::endl;
235 grid_refinement.get_n_refinement_cycles()));
236 data_out.attach_dof_handler(dof_handler, suffix);
237 data_out.add_data_vector(solution, component_names);
238 data_out.write_data_and_clear(*mapping);
248 template <
int dim,
int spacedim>
255 for (
const auto &cycle : grid_refinement.get_refinement_cycles())
264 error_table.error_from_exact(dof_handler, solution, exact_solution);
265 output_results(cycle);
272 if (cycle < grid_refinement.get_n_refinement_cycles() - 1)
273 grid_refinement.estimate_mark_refine(*mapping,
280 error_table.output_table(std::cout);
void push(const std::string &text)
unsigned int depth_console(const unsigned int n)
Quadrature< dim > get_gauss_type_quadrature(const unsigned n_points_1d) const
Poisson problem, serial version.
void solve()
Solve the linear system generated in the assemble_system() function.
void assemble_system()
Assemble the matrix and right hand side vector.
void run()
Main entry point of the program.
void setup_system()
Setup dofs, constraints, and matrices.
void output_results(const unsigned cycle) const
Output the solution.
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
LinearOperator< Domain, Range, Payload > inverse_operator(const LinearOperator< Range, Domain, Payload > &op, Solver &solver, const Preconditioner &preconditioner)
void make_hanging_node_constraints(const DoFHandler< dim, spacedim > &dof_handler, AffineConstraints< number > &constraints)
void make_sparsity_pattern(const DoFHandler< dim, spacedim > &dof_handler, SparsityPatternBase &sparsity_pattern, const AffineConstraints< number > &constraints={}, const bool keep_constrained_dofs=true, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id)
const Mapping< dim, spacedim > & get_default_linear_mapping(const Triangulation< dim, spacedim > &triangulation)
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
unsigned int needed_digits(const unsigned int max_number)
We collect in this namespace all PDEs that are relevant to Fluid Structure Interaction Problems.
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation