47 if (levelSet ==
nullptr) {
49 .addError(
"No level set passed to Interior. Not activating.")
54 if (levelSet->getNumberOfPoints() == 0)
57 const int startWidth = levelSet->getLevelSetWidth();
65 const int maxCycles = guide ? std::numeric_limits<int>::max() : 100;
66 for (
int currentCycle = 0; currentCycle < maxCycles; ++currentCycle) {
69 const T limit = (startWidth + currentCycle + 1);
71 auto &grid = levelSet->getGrid();
72 auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
78 newlsDomain->setLevelSetWidth(startWidth);
79 auto &newDomain = newlsDomain->getDomain();
80 auto &domain = levelSet->getDomain();
82 newDomain.initialize(domain.getNewSegmentation(), domain.getAllocation());
84 const bool updateData = updatePointData;
87 std::vector<std::vector<unsigned>> newDataSourceIds;
89 newDataSourceIds.resize(newDomain.getNumberOfSegments());
91#pragma omp parallel for reduction(+ : addedPoints)
92 for (
unsigned p = 0; p < newDomain.getNumberOfSegments(); ++p) {
93 auto &domainSegment = newDomain.getDomainSegment(p);
95 viennahrle::Index<D>
const startVector =
96 (p == 0) ? grid.getMinGridPoint()
97 : newDomain.getSegmentation()[p - 1];
99 viennahrle::Index<D>
const endVector =
100 (p !=
static_cast<int>(newDomain.getNumberOfSegments() - 1))
101 ? newDomain.getSegmentation()[p]
102 : grid.incrementIndices(grid.getMaxGridPoint());
106 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>;
107 std::unique_ptr<GuideIt> guideIt;
108 if (guide !=
nullptr)
109 guideIt = std::make_unique<GuideIt>(guide->getDomain(), startVector);
111 for (viennahrle::ConstSparseStarIterator<
113 neighborIt(domain, startVector);
114 neighborIt.getIndices() < endVector; neighborIt.next()) {
116 auto ¢erIt = neighborIt.getCenter();
119 bool insideGuide =
false;
121 guideIt->goToIndicesSequential(neighborIt.getIndices());
122 insideGuide = (guideIt->getValue() <
T(0));
132 int definedNeighbor = -1;
133 for (
int i = 0; i < 2 *
D; i++) {
134 auto &nb = neighborIt.getNeighbor(i);
135 T newValue = nb.getValue() -
T(1);
136 if (distance < newValue)
138 if (nb.isDefined() && definedDistance < newValue) {
139 definedDistance = newValue;
145 if (!insideGuide && definedDistance >= -limit &&
146 definedNeighbor != -1) {
148 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
151 newDataSourceIds[p].push_back(
152 neighborIt.getNeighbor(definedNeighbor).getPointId());
155 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
160 domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
163 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
164 centerIt.getValue());
166 newDataSourceIds[p].push_back(centerIt.getPointId());
173 newlsDomain->getPointData().translateFromMultiData(
174 levelSet->getPointData(), newDataSourceIds);
177 newDomain.finalize();
178 levelSet->deepCopy(newlsDomain);
179 if (addedPoints == 0)