45    if (levelSet == 
nullptr) {
 
   47          .addError(
"No level set passed to Expand. Not expanding.")
 
   52    if (width <= levelSet->getLevelSetWidth())
 
   55    if (levelSet->getNumberOfPoints() == 0)
 
   58    const T totalLimit = width * 0.5;
 
   59    const int startWidth = levelSet->getLevelSetWidth();
 
   60    const int numberOfRequiredCycles = width - startWidth;
 
   62    for (
int currentCycle = 0; currentCycle < numberOfRequiredCycles;
 
   65      const int allocationFactor =
 
   66          1 + 1.0 / 
static_cast<double>(startWidth + currentCycle);
 
   67      const T limit = (startWidth + currentCycle + 1) * 
T(0.5);
 
   69      auto &grid = levelSet->getGrid();
 
   70      auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
 
   71      auto &newDomain = newlsDomain->getDomain();
 
   72      auto &domain = levelSet->getDomain();
 
   74      newDomain.initialize(domain.getNewSegmentation(),
 
   75                           domain.getAllocation() * allocationFactor);
 
   77      const bool updateData = updatePointData;
 
   80      std::vector<std::vector<unsigned>> newDataSourceIds;
 
   82        newDataSourceIds.resize(newDomain.getNumberOfSegments());
 
   84#pragma omp parallel num_threads(newDomain.getNumberOfSegments()) 
   88        p = omp_get_thread_num();
 
   91        auto &domainSegment = newDomain.getDomainSegment(p);
 
   93        viennahrle::Index<D> 
const startVector =
 
   94            (p == 0) ? grid.getMinGridPoint()
 
   95                     : newDomain.getSegmentation()[p - 1];
 
   97        viennahrle::Index<D> 
const endVector =
 
   98            (p != 
static_cast<int>(newDomain.getNumberOfSegments() - 1))
 
   99                ? newDomain.getSegmentation()[p]
 
  100                : grid.incrementIndices(grid.getMaxGridPoint());
 
  104                 neighborIt(domain, startVector);
 
  105             neighborIt.getIndices() < endVector; neighborIt.next()) {
 
  107          auto ¢erIt = neighborIt.getCenter();
 
  108          if (std::abs(centerIt.getValue()) <= totalLimit) {
 
  109            domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
 
  110                                                 centerIt.getValue());
 
  112              newDataSourceIds[p].push_back(centerIt.getPointId());
 
  114            if (centerIt.getValue() > -std::numeric_limits<T>::epsilon()) {
 
  117              for (
int i = 0; i < 2 * 
D; i++) {
 
  118                T newValue = neighborIt.getNeighbor(i).getValue() + 
T(1);
 
  119                if (distance > newValue) {
 
  124              if (distance <= limit) {
 
  125                domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
 
  128                  newDataSourceIds[p].push_back(
 
  129                      neighborIt.getNeighbor(neighbor).getPointId());
 
  132                domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
 
  138              for (
int i = 0; i < 2 * 
D; i++) {
 
  139                T newValue = neighborIt.getNeighbor(i).getValue() - 
T(1);
 
  140                if (distance < newValue) {
 
  145              if (distance >= -limit) {
 
  146                domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
 
  149                  newDataSourceIds[p].push_back(
 
  150                      neighborIt.getNeighbor(neighbor).getPointId());
 
  153                domainSegment.insertNextUndefinedPoint(neighborIt.getIndices(),
 
  163        newlsDomain->getPointData().translateFromMultiData(
 
  164            levelSet->getPointData(), newDataSourceIds);
 
  167      newDomain.finalize();
 
  168      levelSet->deepCopy(newlsDomain);
 
  170    levelSet->getDomain().segment();
 
  171    levelSet->finalize(width);