16 #ifndef parsed_tools_boundary_conditions_h
17 #define parsed_tools_boundary_conditions_h
30 #ifdef DEAL_II_WITH_SYMENGINE
62 template <
int spacedim>
72 const std::vector<std::set<dealii::types::boundary_id>> &
ids =
73 {{dealii::numbers::internal_face_boundary_id}},
75 const std::vector<BoundaryConditionType> &
bc_type =
77 const std::vector<std::string> &
expressions = {
"0"});
88 const dealii::Differentiation::SD::types::substitution_map
101 const dealii::Differentiation::SD::types::substitution_map &arguments);
114 template <
typename Tria>
136 const dealii::DoFHandler<dim, spacedim> &dof_handler,
137 dealii::AffineConstraints<double> &constraints)
const;
146 const dealii::Mapping<dim, spacedim> &mapping,
147 const dealii::DoFHandler<dim, spacedim> &dof_handler,
148 dealii::AffineConstraints<double> &constraints)
const;
161 template <
int dim,
typename MatrixType,
typename VectorType>
164 const dealii::DoFHandler<dim, spacedim> &dof_handler,
165 const dealii::AffineConstraints<double> &constraints,
167 VectorType &rhs)
const;
179 template <
int dim,
typename MatrixType,
typename VectorType>
182 const dealii::Mapping<dim, spacedim> &mapping,
183 const dealii::DoFHandler<dim, spacedim> &dof_handler,
184 const dealii::AffineConstraints<double> &constraints,
186 VectorType &rhs)
const;
193 std::set<dealii::types::boundary_id>
201 std::set<dealii::types::boundary_id>
223 std::vector<std::set<dealii::types::boundary_id>>
ids;
243 std::vector<std::unique_ptr<dealii::Functions::SymbolicFunction<spacedim>>>
249 std::vector<dealii::ComponentMask>
masks;
254 std::vector<Components::Type>
types;
267 template <
int spacedim>
268 template <
int dim,
typename MatrixType,
typename VectorType>
271 const dealii::Mapping<dim, spacedim> &mapping,
272 const dealii::DoFHandler<dim, spacedim> &dof_handler,
273 const dealii::AffineConstraints<double> &constraints,
275 VectorType &rhs)
const
277 for (
unsigned int i = 0; i < n_boundary_conditions; ++i)
280 const auto &neumann_ids = ids[i];
281 const auto &
function = functions[i];
282 const auto &mask = masks[i];
284 const auto &fe = dof_handler.get_fe();
290 "Neumann boundary conditions for normal and "
291 "tangential components are not implemented yet."));
293 const auto face_quadrature_formula =
295 fe.tensor_degree() + 1);
297 dealii::FEFaceValues<dim, spacedim> fe_face_values(
300 face_quadrature_formula,
304 const unsigned int dofs_per_cell = fe.n_dofs_per_cell();
305 dealii::FullMatrix<double> cell_matrix(dofs_per_cell, dofs_per_cell);
307 dealii::Vector<double> cell_rhs(dofs_per_cell);
309 std::vector<dealii::types::global_dof_index> local_dof_indices(
311 for (
const auto &cell : dof_handler.active_cell_iterators())
312 if (cell->at_boundary() && cell->is_locally_owned())
316 for (
const unsigned int f : cell->face_indices())
317 if (neumann_ids.find(cell->face(f)->boundary_id()) !=
320 fe_face_values.reinit(cell, f);
321 for (
const unsigned int i : fe_face_values.dof_indices())
324 fe.system_to_component_index(i).first;
326 for (
const unsigned int q_index :
327 fe_face_values.quadrature_point_indices())
329 fe_face_values.shape_value(i, q_index) *
330 function->value(fe_face_values.quadrature_point(
333 fe_face_values.JxW(q_index);
336 cell->get_dof_indices(local_dof_indices);
337 constraints.distribute_local_to_global(cell_rhs,
342 rhs.compress(dealii::VectorOperation::add);
348 template <
int spacedim>
349 template <
int dim,
typename MatrixType,
typename VectorType>
352 const dealii::DoFHandler<dim, spacedim> &dof_handler,
353 const dealii::AffineConstraints<double> &constraints,
355 VectorType &rhs)
const
357 const auto &mapping =
359 apply_natural_boundary_conditions(
360 mapping, dof_handler, constraints, matrix, rhs);
365 template <
int spacedim>
369 const dealii::DoFHandler<dim, spacedim> &dof_handler,
370 dealii::AffineConstraints<double> &constraints)
const
372 const auto &mapping =
374 apply_essential_boundary_conditions(mapping, dof_handler, constraints);
379 template <
int spacedim>
383 const dealii::Mapping<dim, spacedim> &mapping,
384 const dealii::DoFHandler<dim, spacedim> &dof_handler,
385 dealii::AffineConstraints<double> &constraints)
const
389 for (
unsigned int i = 0; i < n_boundary_conditions; ++i)
391 const auto &boundary_ids = ids[i];
392 const auto &bc = bc_type[i];
394 const auto &
mask = masks[i];
396 std::map<dealii::types::boundary_id, const dealii::Function<spacedim> *>
399 if (boundary_ids.find(dealii::numbers::internal_face_boundary_id) !=
403 dof_handler.get_triangulation().get_boundary_ids();
404 for (
const auto &
id : all_ids)
405 fmap[id] =
function.get();
408 for (
const auto &
id : boundary_ids)
409 fmap[id] =
function.get();
418 if constexpr (dim == spacedim && dim > 1)
422 mask.first_selected_component(),
431 "flux boundary conditions "
432 "for this dim and spacedim"));
434 case Components::
Type::tangential:
435 if constexpr (dim == spacedim && dim > 1)
439 mask.first_selected_component(),
447 "Cannot use tangential "
448 "flux boundary conditions "
449 "for this dim and spacedim"));
453 mapping, dof_handler, fmap, constraints, mask);
const std::string section_name
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
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, AffineConstraints< number > &constraints, const ComponentMask &component_mask={})
void compute_nonzero_normal_flux_constraints(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int first_vector_component, const std::set< types::boundary_id > &boundary_ids, const std::map< types::boundary_id, const Function< spacedim, double > * > &function_map, AffineConstraints< double > &constraints, const Mapping< dim, spacedim > &mapping=(ReferenceCells::get_hypercube< dim >() .template get_default_linear_mapping< dim, spacedim >()))
void compute_nonzero_tangential_flux_constraints(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int first_vector_component, const std::set< types::boundary_id > &boundary_ids, const std::map< types::boundary_id, const Function< spacedim, double > * > &function_map, AffineConstraints< double > &constraints, const Mapping< dim, spacedim > &mapping=(ReferenceCells::get_hypercube< dim >() .template get_default_linear_mapping< dim, spacedim >()))
const Mapping< dim, spacedim > & get_default_linear_mapping(const Triangulation< dim, spacedim > &triangulation)
int(&) functions(const void *v1, const void *v2)