41 if (levelSet ==
nullptr) {
43 .addWarning(
"No level set was passed to FromMesh.")
47 if (mesh ==
nullptr) {
49 .addWarning(
"No Mesh<> was supplied to FromMesh.")
54 auto &domain = levelSet->getDomain();
55 auto &nodes = mesh->getNodes();
56 auto values = mesh->cellData.getScalarData(
"LSValues",
true);
58 if (values ==
nullptr) {
60 .addWarning(
"Mesh does not contain level set values (\"LSValues\").")
72 const viennahrle::Grid<D> &grid = domain.getGrid();
73 const T gridDelta = grid.getGridDelta();
75 viennahrle::Index<D> lastIndex;
76 for (
unsigned i = 0; i <
D; ++i) {
77 lastIndex[i] = nodes.front()[i] / gridDelta;
80 if (lastIndex != grid.getMinGridPoint()) {
81 domain.insertNextUndefinedPoint(0, grid.getMinGridPoint(),
87 auto pointDataIt = nodes.begin();
88 auto pointDataEnd = nodes.end();
90 auto valueIt = values->begin();
91 auto valueEnd = values->end();
93 VectorType<bool, D> signs;
94 std::fill(signs.begin(), signs.end(),
95 values->front() <= -std::numeric_limits<T>::epsilon());
97 while (pointDataIt != pointDataEnd && valueIt != valueEnd) {
100 if (std::abs(*valueIt) > 2.5) {
106 bool setPoint =
true;
108 viennahrle::Index<D> currentIndex;
109 for (
unsigned i = 0; i <
D; ++i) {
110 currentIndex[i] = std::round(pointDataIt->at(i) / gridDelta);
115 for (
unsigned i = 0; i <
D; ++i) {
116 if (grid.getBoundaryConditions(i) !=
117 viennahrle::BoundaryType::INFINITE_BOUNDARY) {
118 if (currentIndex[i] > grid.getMaxBounds(i) ||
119 currentIndex[i] < grid.getMinBounds(i)) {
127 domain.insertNextDefinedPoint(0, currentIndex, *valueIt);
131 bool changeSign =
false;
132 for (
int i =
D - 1; i >= 0; --i) {
133 changeSign = changeSign || (currentIndex[i] > lastIndex[i]);
135 signs[i] = *valueIt <= -std::numeric_limits<T>::epsilon();
136 lastIndex[i] = currentIndex[i];
142 viennahrle::Index<D> nextIndex;
148 if (pointDataIt == pointDataEnd) {
149 nextIndex = grid.getMaxGridPoint();
152 for (
unsigned i = 0; i <
D; ++i) {
153 nextIndex[i] = std::round(pointDataIt->at(i) / gridDelta);
160 for (
int q = 0; q <
D; q++) {
161 viennahrle::Index<D> tmp = currentIndex;
163 if (tmp[q] > grid.getMaxGridPoint(q))
165 for (
int r = 0; r < q; ++r)
166 tmp[r] = grid.getMinGridPoint(r);
168 if (tmp >= nextIndex)
171 domain.insertNextUndefinedPoint(0, tmp,