45 if (levelSet ==
nullptr) {
47 .addError(
"No level set passed to Interior. Not activating.")
52 if (levelSet->getNumberOfPoints() == 0)
55 const int startWidth = levelSet->getLevelSetWidth();
57 for (
int currentCycle = 0; currentCycle < 100; ++currentCycle) {
60 const T limit = (startWidth + currentCycle + 1);
62 auto &grid = levelSet->getGrid();
63 auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
64 auto &newDomain = newlsDomain->getDomain();
65 auto &domain = levelSet->getDomain();
67 newDomain.initialize(domain.getNewSegmentation(), domain.getAllocation());
69 const bool updateData = updatePointData;
72 std::vector<std::vector<unsigned>> newDataSourceIds;
74 newDataSourceIds.resize(newDomain.getNumberOfSegments());
76#pragma omp parallel num_threads(newDomain.getNumberOfSegments()) \
77 reduction(+ : addedPoints)
81 p = omp_get_thread_num();
84 auto &domainSegment = newDomain.getDomainSegment(p);
86 viennahrle::Index<D>
const startVector =
87 (p == 0) ? grid.getMinGridPoint()
88 : newDomain.getSegmentation()[p - 1];
90 viennahrle::Index<D>
const endVector =
91 (p !=
static_cast<int>(newDomain.getNumberOfSegments() - 1))
92 ? newDomain.getSegmentation()[p]
93 : grid.incrementIndices(grid.getMaxGridPoint());
97 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>;
98 std::unique_ptr<GuideIt> guideIt;
100 guideIt = std::make_unique<GuideIt>(guide->getDomain(), startVector);
102 for (viennahrle::ConstSparseStarIterator<
104 neighborIt(domain, startVector);
105 neighborIt.getIndices() < endVector; neighborIt.next()) {
107 auto ¢erIt = neighborIt.getCenter();
110 bool insideGuide =
false;
112 guideIt->goToIndicesSequential(neighborIt.getIndices());
113 insideGuide = (guideIt->getValue() <
T(0));
123 int definedNeighbor = -1;
124 for (
int i = 0; i < 2 *
D; i++) {
125 auto &nb = neighborIt.getNeighbor(i);
126 T newValue = nb.getValue() -
T(1);
127 if (distance < newValue)
129 if (nb.isDefined() && definedDistance < newValue) {
130 definedDistance = newValue;
136 if (!insideGuide && definedDistance >= -limit &&
137 definedNeighbor != -1) {
139 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
142 newDataSourceIds[p].push_back(
143 neighborIt.getNeighbor(definedNeighbor).getPointId());
146 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
151 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
154 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
155 centerIt.getValue());
157 newDataSourceIds[p].push_back(centerIt.getPointId());
164 newlsDomain->getPointData().translateFromMultiData(
165 levelSet->getPointData(), newDataSourceIds);
168 newDomain.finalize();
169 levelSet->deepCopy(newlsDomain);
170 if (addedPoints == 0)