24 for (std::size_t k(0); k < 3; ++k)
26 double const tolerance(
27 std::nexttoward(max[k], std::numeric_limits<double>::max()) -
29 if (std::abs(max[k] - min[k]) > tolerance)
37 auto const [min_pnt, max_pnt] = _aabb.getMinMaxPoints();
40 std::array<double, 3>
const delta{{max_pnt[0] - min_pnt[0],
41 max_pnt[1] - min_pnt[1],
42 max_pnt[2] - min_pnt[2]}};
44 const std::size_t n_eles(mesh.getNumberOfElements());
45 const std::size_t n_eles_per_cell(100);
54 auto sc_ceil = [](
double v)
55 {
return static_cast<std::size_t
>(std::ceil(v)); };
61 sc_ceil(std::cbrt(n_eles * delta[0] * delta[0] /
62 (n_eles_per_cell * delta[1] * delta[2])));
64 sc_ceil(_n_steps[0] * std::min(delta[1] / delta[0], 100.0));
66 sc_ceil(_n_steps[0] * std::min(delta[2] / delta[0], 100.0));
71 _n_steps[0] = sc_ceil(std::sqrt(n_eles * delta[0] /
72 (n_eles_per_cell * delta[2])));
73 _n_steps[2] = sc_ceil(_n_steps[0] * delta[2] / delta[0]);
75 else if (dim[0] && dim[1])
77 _n_steps[0] = sc_ceil(std::sqrt(n_eles * delta[0] /
78 (n_eles_per_cell * delta[1])));
79 _n_steps[1] = sc_ceil(_n_steps[0] * delta[1] / delta[0]);
81 else if (dim[1] && dim[2])
83 _n_steps[1] = sc_ceil(std::sqrt(n_eles * delta[1] /
84 (n_eles_per_cell * delta[2])));
86 sc_ceil(n_eles * delta[2] / (n_eles_per_cell * delta[1]));
90 for (std::size_t k(0); k < 3; ++k)
95 sc_ceil(
static_cast<double>(n_eles) / n_eles_per_cell);
102 for (std::size_t k(0); k < 3; k++)
104 _step_sizes[k] = delta[k] / _n_steps[k];
105 _inverse_step_sizes[k] = 1.0 / _step_sizes[k];
108 _elements_in_grid_box.resize(_n_steps[0] * _n_steps[1] * _n_steps[2]);
109 sortElementsInGridCells(mesh);
136 std::array<std::size_t, 3> min{};
137 std::array<std::size_t, 3> max{};
160 for (std::size_t j(0); j < 3; ++j)
162 if (min[j] > c.second[j])
164 min[j] = c.second[j];
166 if (max[j] < c.second[j])
168 max[j] = c.second[j];
179 for (std::size_t k(0); k < 3; ++k)
181 max[k] = std::min(
_n_steps[k] - 1, max[k]);
185 for (std::size_t i(min[0]); i <= max[0]; i++)
187 for (std::size_t j(min[1]); j <= max[1]; j++)
189 for (std::size_t k(min[2]); k <= max[2]; k++)
192 .push_back(&element);
std::vector< std::size_t > getNodes(GeoLib::Point const &pnt, std::vector< MeshLib::Node * > const &nodes, MeshLib::PropertyVector< int > const &mat_ids, std::pair< int, int > const &mat_limits, std::pair< double, double > const &elevation_limits, MeshLib::Mesh const &mesh)