include/meltpooldg/core/boundary_conditions.hpp Source File

Developer Documentation: include/meltpooldg/core/boundary_conditions.hpp Source File
Developer Documentation
boundary_conditions.hpp
Go to the documentation of this file.
1#pragma once
2#include <deal.II/base/exceptions.h>
3#include <deal.II/base/function.h>
4#include <deal.II/base/types.h>
5
7
8#include <map>
9#include <memory>
10#include <ranges>
11#include <string>
12
13namespace MeltPoolDG
14{
15 template <int dim, typename number>
17 {
18 private:
30 std::map<std::string,
31 std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>>
33
34 public:
50 void
52 std::pair<const dealii::types::boundary_id, const std::shared_ptr<dealii::Function<dim>>>
53 id_and_function,
54 const std::string &type)
55 {
56 AssertThrow(!bc[type].contains(id_and_function.first), ExcBCAlreadyAssigned(type));
57
58 bc[type][id_and_function.first] = id_and_function.second;
59 }
60
69 void
70 set_time(const number time)
71 {
72 for (const auto &[type, outer_map] : bc)
73 for (const auto &[id_, function_ptr] : outer_map)
74 if (function_ptr)
75 function_ptr->set_time(time);
76 }
77
90 std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
91 get_bc_of_type(const std::string type, const bool is_optional = true) const
92 {
93 AssertThrow(is_optional || bc.contains(type), dealii::ExcMessage("Type not found: " + type));
94
95 if (!bc.contains(type))
96 return std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>();
97 else
98 return bc.at(type);
99 }
100
111 std::vector<dealii::types::boundary_id>
112 get_indices_of_type(const std::string type, const bool is_optional = true) const
113 {
114 auto bc_of_type = get_bc_of_type(type, is_optional);
115 auto kv = std::views::keys(bc_of_type);
116 return {kv.begin(), kv.end()};
117 }
118
133 std::string
134 get_type(dealii::types::boundary_id id, const bool is_optional = true) const
135 {
136 for (const auto &[type_, inner_map] : bc)
137 if (inner_map.contains(id))
138 return type_; // Found boundary ID, return type
139
140 // If not found, check the is_optional flag
141 AssertThrow(is_optional, dealii::ExcMessage("Boundary ID not found in boundary conditions."));
142
143 // If optional, return an empty string as a fallback
144 return "";
145 }
146 };
147} // namespace MeltPoolDG
Definition boundary_conditions.hpp:17
void attach_boundary_condition(std::pair< const dealii::types::boundary_id, const std::shared_ptr< dealii::Function< dim > > > id_and_function, const std::string &type)
Attach a boundary condition to the manager.
Definition boundary_conditions.hpp:51
std::map< std::string, std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > > bc
Nested map for storing boundary conditions.
Definition boundary_conditions.hpp:32
std::string get_type(dealii::types::boundary_id id, const bool is_optional=true) const
Retrieve the type of a boundary condition by its ID.
Definition boundary_conditions.hpp:134
std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > get_bc_of_type(const std::string type, const bool is_optional=true) const
Retrieve all boundary conditions of a specific type.
Definition boundary_conditions.hpp:91
std::vector< dealii::types::boundary_id > get_indices_of_type(const std::string type, const bool is_optional=true) const
Get all boundary IDs associated with a specific type.
Definition boundary_conditions.hpp:112
void set_time(const number time)
Set the time for all time-dependent boundary conditions.
Definition boundary_conditions.hpp:70
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17