19 const std::string &physWall,
20 const std::string &physOpen) {
22 std::vector<std::pair<int, int>> bnd;
23 gmsh::model::getBoundary({{2, surfaceTag}}, bnd,
false);
25 std::vector<int> wallTags;
26 std::vector<int> openTags;
27 wallTags.reserve(bnd.size());
28 openTags.reserve(bnd.size());
30 const double horizEps = std::max(tol * 1.0e-3, 1.0e-12 * (1.0 + std::abs(yOpen)));
32 for (
const auto &pr : bnd) {
35 double xmin = 0., ymin = 0., zmin = 0., xmax = 0., ymax = 0., zmax = 0.;
36 gmsh::model::getBoundingBox(pr.first, pr.second, xmin, ymin, zmin, xmax, ymax, zmax);
37 const double dy = ymax - ymin;
38 const double yc = 0.5 * (ymin + ymax);
39 const bool nearlyHorizontal = dy < horizEps;
40 const bool nearTopOpen = yc >= yOpen - tol && nearlyHorizontal;
42 openTags.push_back(pr.second);
44 wallTags.push_back(pr.second);
47 if (!wallTags.empty()) {
48 const int g = gmsh::model::addPhysicalGroup(1, wallTags, -1);
49 gmsh::model::setPhysicalName(1, g, physWall);
51 if (!openTags.empty()) {
52 const int g = gmsh::model::addPhysicalGroup(1, openTags, -1);
53 gmsh::model::setPhysicalName(1, g, physOpen);