30 template <
int dim,
int spacedim>
33 , grid_generator(
"/PoissonNitscheInterface/Grid/Ambient")
34 , embedded_grid_generator(
"/PoissonNitscheInterface/Grid/Embedded")
35 , grid_refinement(
"/PoissonNitscheInterface/Grid/Refinement")
36 , space_fe(
"/PoissonNitscheInterface/",
"u",
"FE_Q(1)")
37 , space_dh(space_triangulation)
39 , preconditioner(
"/PoissonNitscheInterface/Solver/AMG Preconditioner")
40 , constants(
"/PoissonNitscheInterface/Constants",
43 {
"Diffusion coefficient"})
44 , forcing_term(
"/PoissonNitscheInterface/Functions",
45 "kappa*8*PI^2*sin(2*PI*x)*sin(2*PI*y)",
47 , embedded_value(
"/PoissonNitscheInterface/Functions",
50 , nitsche_coefficient(
"/PoissonNitscheInterface/Functions",
53 , exact_solution(
"/PoissonNitscheInterface/Functions",
54 "sin(2*PI*x)*sin(2*PI*y)",
56 , boundary_conditions(
"/PoissonNitscheInterface/Boundary conditions")
60 , error_table(
"/PoissonNitscheInterface/Error table")
61 , data_out(
"/PoissonNitscheInterface/Output")
63 add_parameter(
"Console level", this->console_level);
68 template <
int dim,
int spacedim>
73 grid_generator.generate(space_triangulation);
74 embedded_grid_generator.generate(embedded_triangulation);
78 space_cache = std::make_unique<GridTools::Cache<spacedim, spacedim>>(
80 embedded_cache = std::make_unique<GridTools::Cache<dim, spacedim>>(
81 embedded_triangulation);
86 template <
int dim,
int spacedim>
91 deallog <<
"System setup" << std::endl;
93 const auto ref_cells = space_triangulation.get_reference_cells();
95 ref_cells.size() == 1,
97 "This program does nots support mixed simplx/hex grid types."));
101 ExcMessage(
"The finite element must be defined on the same "
102 "cell type as the grid."));
106 boundary_conditions.update_user_substitution_map(constants);
107 exact_solution.update_constants(constants);
108 forcing_term.update_constants(constants);
109 embedded_value.update_constants(constants);
110 space_dh.distribute_dofs(space_fe);
115 deallog <<
"Number of dofs " << space_dh.n_dofs() << std::endl;
117 space_constraints.clear();
121 boundary_conditions.check_consistency(space_triangulation);
124 boundary_conditions.apply_essential_boundary_conditions(
125 *mapping, space_dh, space_constraints);
126 space_constraints.close();
131 sparsity_pattern.copy_from(dsp);
132 system_matrix.reinit(sparsity_pattern);
133 solution.reinit(space_dh.n_dofs());
134 system_rhs.reinit(space_dh.n_dofs());
139 template <
int dim,
int spacedim>
145 deallog <<
"Assemble system" << std::endl;
151 space_fe().tensor_degree() + 1);
162 const unsigned int dofs_per_cell = space_fe().n_dofs_per_cell();
165 std::vector<types::global_dof_index> local_dof_indices(dofs_per_cell);
166 for (
const auto &cell : space_dh.active_cell_iterators())
168 fe_values.reinit(cell);
171 for (
const unsigned int q_index :
172 fe_values.quadrature_point_indices())
174 for (
const unsigned int i : fe_values.dof_indices())
175 for (
const unsigned int j : fe_values.dof_indices())
177 (constants[
"kappa"] *
178 fe_values.shape_grad(i, q_index) *
179 fe_values.shape_grad(j, q_index) *
180 fe_values.JxW(q_index));
181 for (
const unsigned int i : fe_values.dof_indices())
183 (fe_values.shape_value(i, q_index) *
185 fe_values.quadrature_point(q_index)) *
186 fe_values.JxW(q_index));
189 cell->get_dof_indices(local_dof_indices);
190 space_constraints.distribute_local_to_global(cell_matrix,
199 deallog <<
"Assemble Nitsche contributions" <<
'\n';
207 assemble_nitsche_with_exact_intersections<spacedim, dim, spacedim>(
222 create_nitsche_rhs_with_exact_intersections<spacedim, dim, spacedim>(
236 template <
int dim,
int spacedim>
241 deallog <<
"Solve system" << std::endl;
242 preconditioner.initialize(system_matrix);
243 const auto A = linear_operator<Vector<double>>(system_matrix);
245 solution = Ainv * system_rhs;
246 space_constraints.distribute(solution);
253 template <
int dim,
int spacedim>
256 const unsigned cycle)
const
259 deallog <<
"Output results" << std::endl;
264 grid_refinement.get_n_refinement_cycles()));
265 data_out.attach_dof_handler(space_dh, suffix);
266 data_out.add_data_vector(solution, component_names);
267 data_out.write_data_and_clear(*mapping);
270 std::ofstream output_test_space(
"space_grid.vtk");
272 std::ofstream output_test_embedded(
"embedded_grid.vtk");
280 template <
int dim,
int spacedim>
288 for (
const auto &cycle : grid_refinement.get_refinement_cycles())
297 cells_and_quads = NonMatching::compute_intersection(
298 *space_cache, *embedded_cache, 2 * space_fe().tensor_degree() + 1);
304 error_table.error_from_exact(space_dh, solution, exact_solution);
305 output_results(cycle);
308 if (cycle < grid_refinement.get_n_refinement_cycles() - 1)
309 grid_refinement.estimate_mark_refine(*mapping,
312 space_triangulation);
318 error_table.output_table(std::cout);
void write_vtk(const Triangulation< dim, spacedim > &tria, std::ostream &out) const
std::ostream & get_console()
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
Imposing an interaface condition in Poisson problem, serial version.
void output_results(const unsigned cycle) const
void setup_system()
Setup dofs, constraints, and matrices.
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.