59 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
61 auto & boundary_info =
mesh->get_boundary_info();
65 std::set<BoundaryID> boundary_ids = boundary_info.get_boundary_ids();
68 mesh->comm().set_union(boundary_ids);
72 auto get_unused_boundary_id = [
this, &boundary_ids, &boundary_info]()
76 if (!boundary_ids.count(
id) && !boundary_info.get_sideset_name_map().count(
id) &&
77 !boundary_info.get_nodeset_name_map().count(
id))
79 boundary_ids.insert(
id);
89 const auto is_boundary_id = [](
const BoundaryName & boundary_name)
90 {
return MooseUtils::isDigits(boundary_name); };
96 std::vector<std::string> old_boundary_names(num_boundaries);
97 std::stringstream missing_boundary;
98 for (
const auto i : make_range(num_boundaries))
104 old_boundary_ids[i] = id;
107 if (!boundary_ids.count(
id))
108 missing_boundary <<
name <<
" ";
112 if (is_boundary_id(
name))
114 old_boundary_names[i] = boundary_info.get_sideset_name(
id);
115 if (old_boundary_names[i].empty())
116 old_boundary_names[i] = boundary_info.get_nodeset_name(
id);
120 old_boundary_names[i] =
name;
122 if (missing_boundary.str().size())
124 "The following boundaries were requested to be renamed, but do not exist: ",
125 missing_boundary.str());
129 std::map<BoundaryID, std::string> new_names;
130 for (
const auto i : make_range(num_boundaries))
135 if (is_boundary_id(
name))
138 new_boundary_ids[i] = id;
142 boundary_ids.insert(
id);
145 if (old_boundary_names[i].size())
148 if (old_boundary_names[i] == std::to_string(old_boundary_ids[i]))
149 new_names[id] = std::to_string(new_boundary_ids[i]);
151 new_names[id] = old_boundary_names[i];
159 bool name_already_exists =
false;
163 for (
const auto map : {&boundary_info.set_sideset_name_map(),
164 &boundary_info.set_nodeset_name_map(),
166 for (
const auto & id_name_pair : *map)
167 if (!name_already_exists && id_name_pair.second ==
name)
169 new_boundary_ids[i] = id_name_pair.first;
170 new_names[id_name_pair.first] =
name;
171 name_already_exists =
true;
175 if (!name_already_exists)
177 new_boundary_ids[i] = old_boundary_ids[i];
178 new_names[new_boundary_ids[i]] =
name;
194 auto temp_new_boundary_ids = new_boundary_ids;
195 std::vector<std::pair<BoundaryID, BoundaryID>> temp_change_ids;
197 for (
const auto new_i : make_range(num_boundaries))
202 for (
const auto old_i : make_range(new_i + 1, num_boundaries))
203 if (new_boundary_ids[new_i] == old_boundary_ids[old_i])
205 const auto temp_id = get_unused_boundary_id();
206 temp_change_ids.emplace_back(temp_id, new_boundary_ids[new_i]);
207 temp_new_boundary_ids[new_i] = temp_id;
213 for (
const auto i : make_range(num_boundaries))
214 MeshTools::Modification::change_boundary_id(
215 *
mesh, old_boundary_ids[i], temp_new_boundary_ids[i]);
218 for (
const auto & pair : temp_change_ids)
219 MeshTools::Modification::change_boundary_id(*
mesh, pair.first, pair.second);
222 for (
const auto i : make_range(num_boundaries))
224 if (boundary_info.get_sideset_name_map().count(old_boundary_ids[i]))
225 boundary_info.set_sideset_name_map().erase(old_boundary_ids[i]);
226 if (boundary_info.get_nodeset_name_map().count(old_boundary_ids[i]))
227 boundary_info.set_nodeset_name_map().erase(old_boundary_ids[i]);
231 for (
const auto & pair : new_names)
233 boundary_info.sideset_name(pair.first) = pair.second;
234 boundary_info.nodeset_name(pair.first) = pair.second;
237 mesh->unset_is_prepared();
238 return dynamic_pointer_cast<MeshBase>(
mesh);