35 , grid_generator(
"/Stokes/Grid")
36 , grid_refinement(
"/Stokes/Grid/Refinement")
37 , finite_element(
"/Stokes/",
39 "FESystem[FE_Q(2)^d-FE_Q(1)]")
40 , dof_handler(triangulation)
42 , velocity_preconditioner(
"/Stokes/Solver/AMG Velocity preconditioner")
43 , schur_preconditioner(
"/Stokes/Solver/AMG Schur preconditioner")
44 , constants(
"/Stokes/Constants", {
"eta"}, {1.0}, {
"Viscosity"})
55 , boundary_conditions(
56 "/Stokes/Boundary conditions",
66 , data_out(
"/Stokes/Output")
70 enter_subsection(
"Error table (" + component_names +
")");
71 enter_my_subsection(this->prm);
72 error_table.add_parameters(this->prm);
73 leave_my_subsection(this->prm);
75 add_parameter(
"Console level", this->console_level);
84 deallog <<
"System setup" << std::endl;
88 ref_cells.size() == 1,
90 "This program does nots support mixed simplx/hex grid types."));
94 ExcMessage(
"The finite element must be defined on the same "
95 "cell type as the grid."));
97 boundary_conditions.update_user_substitution_map(constants);
98 exact_solution.update_constants(constants);
99 forcing_term.update_constants(constants);
101 dof_handler.distribute_dofs(finite_element);
112 deallog <<
"Number of dofs " << dof_handler.n_dofs() <<
"("
113 << dofs_per_block[0] <<
" + " << dofs_per_block[1] <<
")"
119 boundary_conditions.apply_essential_boundary_conditions(*mapping,
127 sparsity_pattern.copy_from(dsp);
128 system_matrix.reinit(sparsity_pattern);
129 solution.reinit(dofs_per_block);
130 system_rhs.reinit(dofs_per_block);
131 boundary_conditions.apply_natural_boundary_conditions(
132 *mapping, dof_handler, constraints, system_matrix, system_rhs);
141 deallog <<
"Assemble system" << std::endl;
142 const ReferenceCell cell_type = finite_element().reference_cell();
146 finite_element().tensor_degree() + 1);
149 if constexpr (dim > 1)
153 face_quadrature_formula =
155 finite_element().tensor_degree() + 1);
159 face_quadrature_formula =
160 QGauss<dim - 1>(finite_element().tensor_degree() + 1);
170 const unsigned int dofs_per_cell = finite_element().n_dofs_per_cell();
173 std::vector<types::global_dof_index> local_dof_indices(dofs_per_cell);
174 for (
const auto &cell : dof_handler.active_cell_iterators())
179 for (
const unsigned int q_index :
182 for (
const unsigned int i : fe_values.
dof_indices())
184 const auto &eps_v = fe_values[velocity].gradient(i, q_index);
186 fe_values[velocity].divergence(i, q_index);
187 const auto &q = fe_values[pressure].value(i, q_index);
189 for (
const unsigned int j : fe_values.
dof_indices())
192 fe_values[velocity].gradient(j, q_index);
194 fe_values[velocity].divergence(j, q_index);
195 const auto &p = fe_values[pressure].value(j, q_index);
197 (constants[
"eta"] * scalar_product(eps_v, eps_u) -
198 p * div_v - q * div_u + q * p / constants[
"eta"]) *
199 fe_values.
JxW(q_index);
206 .system_to_component_index(i)
208 fe_values.
JxW(q_index));
211 cell->get_dof_indices(local_dof_indices);
212 constraints.distribute_local_to_global(cell_matrix,
226 deallog <<
"Solve system" << std::endl;
233 velocity_preconditioner.initialize(system_matrix.block(0, 0));
234 schur_preconditioner.initialize(system_matrix.block(1, 1));
235 deallog <<
"Preconditioners initialized" << std::endl;
244 std::array<decltype(precA), 2> tmp_prec = {{precA, precS}};
245 const auto diagprecAA = block_diagonal_operator<2>(tmp_prec);
251 const auto Zero = 0 * M;
253 const auto AA = block_operator<2, 2>({{{{A, Bt}}, {{B, Zero}}}});
261 solution = inv * system_rhs;
266 solution = inv * system_rhs;
269 constraints.distribute(solution);
309 deallog <<
"Output results" << std::endl;
314 grid_refinement.get_n_refinement_cycles()));
315 data_out.attach_dof_handler(dof_handler, suffix);
316 data_out.add_data_vector(solution, component_names);
317 data_out.write_data_and_clear(*mapping);
329 for (
unsigned int cycle = 0;
330 cycle < grid_refinement.get_n_refinement_cycles();
337 error_table.error_from_exact(dof_handler, solution, exact_solution);
338 output_results(cycle);
339 if (cycle < grid_refinement.get_n_refinement_cycles() - 1)
340 grid_refinement.estimate_mark_refine(*mapping,
346 error_table.output_table(std::cout);
const Point< spacedim > & quadrature_point(const unsigned int q_point) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > dof_indices() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
double JxW(const unsigned int q_point) const
const double & shape_value(const unsigned int i, const unsigned int q_point) const
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell)
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
ReferenceCell face_reference_cell(const unsigned int face_no) const
void output_results(const unsigned cycle) const
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)
LinearOperator< Domain, Range, typename BlockPayload::BlockType > block_back_substitution(const BlockLinearOperator< Range, Domain, BlockPayload > &block_operator, const BlockLinearOperator< Domain, Range, BlockPayload > &diagonal_inverse)
LinearOperator< Range, Domain, TrilinosWrappers::internal::LinearOperatorImplementation::TrilinosPayload > linear_operator(const TrilinosWrappers::SparseMatrix &operator_exemplar, const Matrix &matrix)
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 component_wise(DoFHandler< dim, spacedim > &dof_handler, const std::vector< unsigned int > &target_component=std::vector< unsigned int >())
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
std::vector< std::string > split_string_list(const std::string &s, const std::string &delimiter=",")
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)
PDEs::Stokes< dim, LAC::LAPETSc > Stokes
We collect in this namespace all PDEs that are relevant to Fluid Structure Interaction Problems.
const types::boundary_id internal_face_boundary_id
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation