From b42fa59a58ec27b6266d772620df32926c0117db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matou=C5=A1=20Fencl?= <fenclmat@fjfi.cvut.cz>
Date: Sat, 16 Mar 2019 11:10:46 +0100
Subject: [PATCH] deleting tnlDirectEikonalMethodsBase_impl.h

---
 .../tnlDirectEikonalMethodsBase_impl.h        | 1591 -----------------
 1 file changed, 1591 deletions(-)
 delete mode 100644 src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase_impl.h

diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase_impl.h
deleted file mode 100644
index a5d3d81df0..0000000000
--- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase_impl.h
+++ /dev/null
@@ -1,1591 +0,0 @@
-/* 
- * File:   tnlDirectEikonalMethodsBase_impl.h
- * Author: oberhuber
- *
- * Created on July 14, 2016, 3:22 PM
- */
-
-#pragma once
-
-#include <limits>
-
-#include <iostream>
-#include "tnlFastSweepingMethod.h"
-#include "tnlDirectEikonalMethodsBase.h"
-
-template< typename Real,
-        typename Device,
-        typename Index >
-void
-tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > >::
-initInterface( const MeshFunctionPointer& _input,
-        MeshFunctionPointer& _output,
-        InterfaceMapPointer& _interfaceMap  )
-{
-  if( std::is_same< Device, Devices::Cuda >::value )
-  {
-#ifdef HAVE_CUDA
-    const MeshType& mesh = _input->getMesh();
-    
-    const int cudaBlockSize( 16 );
-    int numBlocksX = Devices::Cuda::getNumberOfBlocks( mesh.getDimensions().x(), cudaBlockSize );
-    dim3 blockSize( cudaBlockSize );
-    dim3 gridSize( numBlocksX );
-    Devices::Cuda::synchronizeDevice();
-    CudaInitCaller<<< gridSize, blockSize >>>( _input.template getData< Device >(),
-            _output.template modifyData< Device >(),
-            _interfaceMap.template modifyData< Device >() );
-    cudaDeviceSynchronize();
-    TNL_CHECK_CUDA_DEVICE;
-#endif
-  }
-  if( std::is_same< Device, Devices::Host >::value )
-  {
-    const MeshType& mesh = _input->getMesh();
-    typedef typename MeshType::Cell Cell;
-    const MeshFunctionType& input = _input.getData();
-    MeshFunctionType& output = _output.modifyData();
-    InterfaceMapType& interfaceMap = _interfaceMap.modifyData();
-    Cell cell( mesh );
-    for( cell.getCoordinates().x() = 0;
-            cell.getCoordinates().x() < mesh.getDimensions().x();
-            cell.getCoordinates().x() ++ )
-    {
-      cell.refresh();
-      output[ cell.getIndex() ] =
-              input( cell ) >= 0 ? std::numeric_limits< RealType >::max() :
-                -std::numeric_limits< RealType >::max();
-      interfaceMap[ cell.getIndex() ] = false;
-    }
-    
-    
-    const RealType& h = mesh.getSpaceSteps().x();
-    for( cell.getCoordinates().x() = 0;
-            cell.getCoordinates().x() < mesh.getDimensions().x() - 1;
-            cell.getCoordinates().x() ++ )
-    {
-      cell.refresh();
-      const RealType& c = input( cell );      
-      if( ! cell.isBoundaryEntity()  )
-      {
-        const auto& neighbors = cell.getNeighborEntities();
-        Real pom = 0;
-        //const IndexType& c = cell.getIndex();
-        const IndexType e = neighbors.template getEntityIndex<  1 >();
-        if( c * input[ e ] <= 0 )
-        {
-          pom = TNL::sign( c )*( h * c )/( c - input[ e ]);
-          if( TNL::abs( output[ cell.getIndex() ] ) > TNL::abs( pom ) )
-            output[ cell.getIndex() ] = pom;
-          
-          pom = pom - TNL::sign( c )*h; //output[ e ] = (hx * c)/( c - input[ e ]) - hx;
-          if( TNL::abs( output[ e ] ) > TNL::abs( pom ) )
-            output[ e ] = pom; 
-          
-          interfaceMap[ cell.getIndex() ] = true;
-          interfaceMap[ e ] = true;
-        }
-      }
-    }
-  }
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-template< int sizeSArray >
-void
-tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >::
-updateBlocks( InterfaceMapType interfaceMap,
-        MeshFunctionType aux,
-        MeshFunctionType helpFunc,
-        ArrayContainer BlockIterHost, int numThreadsPerBlock/*, Real **sArray*/ )
-{
-#pragma omp parallel for schedule( dynamic )
-  for( IndexType i = 0; i < BlockIterHost.getSize(); i++ )
-  {
-    if( BlockIterHost[ i ] )
-    {
-      MeshType mesh = interfaceMap.template getMesh< Devices::Host >();
-      
-      int dimX = mesh.getDimensions().x(); int dimY = mesh.getDimensions().y();
-      //std::cout << "dimX = " << dimX << " ,dimY = " << dimY << std::endl;
-      int numOfBlocky = dimY/numThreadsPerBlock + ((dimY%numThreadsPerBlock != 0) ? 1:0);
-      int numOfBlockx = dimX/numThreadsPerBlock + ((dimX%numThreadsPerBlock != 0) ? 1:0);
-      //std::cout << "numOfBlockx = " << numOfBlockx << " ,numOfBlocky = " << numOfBlocky << std::endl;
-      int xkolik = numThreadsPerBlock + 1;
-      int ykolik = numThreadsPerBlock + 1;
-      
-      int blIdx = i%numOfBlockx;
-      int blIdy = i/numOfBlockx;
-      //std::cout << "blIdx = " << blIdx << " ,blIdy = " << blIdy << std::endl;
-      
-      if( numOfBlockx - 1 == blIdx )
-        xkolik = dimX - (blIdx)*numThreadsPerBlock+1;
-      
-      if( numOfBlocky -1 == blIdy )
-        ykolik = dimY - (blIdy)*numThreadsPerBlock+1;
-      //std::cout << "xkolik = " << xkolik << " ,ykolik = " << ykolik << std::endl;
-      
-      
-      /*bool changed[numThreadsPerBlock*numThreadsPerBlock];
-       changed[ 0 ] = 1;*/
-      Real hx = mesh.getSpaceSteps().x();
-      Real hy = mesh.getSpaceSteps().y();
-      
-      bool changed = false;
-      BlockIterHost[ blIdy * numOfBlockx + blIdx ] = 0;
-      
-      
-      Real *sArray;
-      sArray = new Real[ sizeSArray * sizeSArray ];
-      if( sArray == nullptr )
-        std::cout << "Error while allocating memory for sArray." << std::endl;
-      
-      for( IndexType thri = 0; thri < sizeSArray; thri++ ){
-        for( IndexType thrj = 0; thrj < sizeSArray; thrj++ )
-          sArray[ thri * sizeSArray + thrj ] = std::numeric_limits< Real >::max();
-      }
-      
-      
-      //printf("numThreadsPerBlock = %d\n", numThreadsPerBlock);
-      for( IndexType thrj = 0; thrj < numThreadsPerBlock + 1; thrj++ )
-      {        
-        if( dimX > (blIdx+1) * numThreadsPerBlock  && thrj+1 < ykolik )
-          sArray[ ( thrj+1 )* sizeSArray +xkolik] = aux[ blIdy*numThreadsPerBlock*dimX - dimX + blIdx*numThreadsPerBlock - 1 + (thrj+1)*dimX + xkolik ];
-        
-        
-        if( blIdx != 0 && thrj+1 < ykolik )
-          sArray[(thrj+1)* sizeSArray] = aux[ blIdy*numThreadsPerBlock*dimX - dimX + blIdx*numThreadsPerBlock - 1 + (thrj+1)*dimX ];
-        
-        if( dimY > (blIdy+1) * numThreadsPerBlock  && thrj+1 < xkolik )
-          sArray[ykolik * sizeSArray + thrj+1] = aux[ blIdy*numThreadsPerBlock*dimX - dimX + blIdx*numThreadsPerBlock - 1 + ykolik*dimX + thrj+1 ];
-        
-        if( blIdy != 0 && thrj+1 < xkolik )
-          sArray[thrj+1] = aux[ blIdy*numThreadsPerBlock*dimX - dimX + blIdx*numThreadsPerBlock - 1 + thrj+1 ];
-      }
-      
-      for( IndexType k = 0; k < numThreadsPerBlock; k++ ){
-        for( IndexType l = 0; l < numThreadsPerBlock; l++ )
-          if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX )
-            sArray[(k+1) * sizeSArray + l+1] = aux[ blIdy * numThreadsPerBlock * dimX + numThreadsPerBlock * blIdx  + k*dimX + l ];
-      }
-      
-      for( IndexType k = 0; k < numThreadsPerBlock; k++ ){ 
-        for( IndexType l = 0; l < numThreadsPerBlock; l++ ){
-          if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX ){
-            //std::cout << "proslo i = " << k * numThreadsPerBlock + l << std::endl;
-            if( ! interfaceMap[ blIdy * numThreadsPerBlock * dimX + numThreadsPerBlock * blIdx  + k*dimX + l ] )
-            {
-              changed = this->template updateCell< sizeSArray >( sArray, l+1, k+1, hx,hy) || changed;
-              
-            }
-          }
-        }
-      }
-      /*aux.save( "aux-1pruch.tnl" );
-       for( int k = 0; k < sizeSArray; k++ ){ 
-       for( int l = 0; l < sizeSArray; l++ ) {
-       std::cout << sArray[ k * sizeSArray + l] << " ";
-       }
-       std::cout << std::endl;
-       }*/
-      
-      for( IndexType k = 0; k < numThreadsPerBlock; k++ ) 
-        for( IndexType l = numThreadsPerBlock-1; l >-1; l-- ) { 
-          if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX )
-          {
-            if( ! interfaceMap[ blIdy * numThreadsPerBlock * dimX + numThreadsPerBlock * blIdx  + k*dimX + l ] )
-            {
-              this->template updateCell< sizeSArray >( sArray, l+1, k+1, hx,hy);
-            }
-          }
-        }
-      /*aux.save( "aux-2pruch.tnl" );
-       for( int k = 0; k < sizeSArray; k++ ){ 
-       for( int l = 0; l < sizeSArray; l++ ) {
-       std::cout << sArray[ k * sizeSArray + l] << " ";
-       }
-       std::cout << std::endl;
-       }*/
-      
-      for( IndexType k = numThreadsPerBlock-1; k > -1; k-- ) 
-        for( IndexType l = 0; l < numThreadsPerBlock; l++ ) {
-          if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX )
-          {
-            if( ! interfaceMap[ blIdy * numThreadsPerBlock * dimX + numThreadsPerBlock * blIdx  + k*dimX + l ] )
-            {
-              this->template updateCell< sizeSArray >( sArray, l+1, k+1, hx,hy);
-            }
-          }
-        }
-      /*aux.save( "aux-3pruch.tnl" );
-       for( int k = 0; k < sizeSArray; k++ ){ 
-       for( int l = 0; l < sizeSArray; l++ ) {
-       std::cout << sArray[ k * sizeSArray + l] << " ";
-       }
-       std::cout << std::endl;
-       }*/
-      
-      for( IndexType k = numThreadsPerBlock-1; k > -1; k-- ){
-        for( IndexType l = numThreadsPerBlock-1; l >-1; l-- ) { 
-          if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX )
-          {
-            if( ! interfaceMap[ blIdy * numThreadsPerBlock * dimX + numThreadsPerBlock * blIdx  + k*dimX + l ] )
-            {
-              this->template updateCell< sizeSArray >( sArray, l+1, k+1, hx, hy, 1.0);
-            }
-          }
-        }
-      }
-      /*aux.save( "aux-4pruch.tnl" );
-       for( int k = 0; k < sizeSArray; k++ ){ 
-       for( int l = 0; l < sizeSArray; l++ ) {
-       std::cout << sArray[ k * sizeSArray + l] << " ";
-       }
-       std::cout << std::endl;
-       }*/
-      
-      
-      if( changed ){
-        BlockIterHost[ blIdy * numOfBlockx + blIdx ] = 1;
-      }
-      
-      
-      for( IndexType k = 0; k < numThreadsPerBlock; k++ ){ 
-        for( IndexType l = 0; l < numThreadsPerBlock; l++ ) {
-          if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX )      
-            helpFunc[ blIdy * numThreadsPerBlock * dimX + numThreadsPerBlock * blIdx  + k*dimX + l ] = sArray[ (k + 1)* sizeSArray + l + 1 ];
-          //std::cout<< sArray[k+1][l+1];
-        }
-        //std::cout<<std::endl;
-      }
-      delete []sArray;
-    }
-  }
-}
-template< typename Real,
-        typename Device,
-        typename Index >
-template< int sizeSArray >
-void
-tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >::
-updateBlocks( const InterfaceMapType& interfaceMap,
-        const MeshFunctionType& aux,
-        MeshFunctionType& helpFunc,
-        ArrayContainer BlockIterHost, int numThreadsPerBlock/*, Real **sArray*/ )
-{  
-//#pragma omp parallel for schedule( dynamic )
-  for( IndexType i = 0; i < BlockIterHost.getSize(); i++ )
-  {
-    if( BlockIterHost[ i ] )
-    {
-      MeshType mesh = interfaceMap.template getMesh< Devices::Host >();
-      
-      int dimX = mesh.getDimensions().x(); int dimY = mesh.getDimensions().y();
-      int dimZ = mesh.getDimensions().z();
-      //std::cout << "dimX = " << dimX << " ,dimY = " << dimY << std::endl;
-      int numOfBlocky = dimY/numThreadsPerBlock + ((dimY%numThreadsPerBlock != 0) ? 1:0);
-      int numOfBlockx = dimX/numThreadsPerBlock + ((dimX%numThreadsPerBlock != 0) ? 1:0);
-      int numOfBlockz = dimZ/numThreadsPerBlock + ((dimZ%numThreadsPerBlock != 0) ? 1:0);
-      //std::cout << "numOfBlockx = " << numOfBlockx << " ,numOfBlocky = " << numOfBlocky << std::endl;
-      int xkolik = numThreadsPerBlock + 1;
-      int ykolik = numThreadsPerBlock + 1;
-      int zkolik = numThreadsPerBlock + 1;
-      
-      
-      int blIdz = i/( numOfBlockx * numOfBlocky );
-      int blIdy = (i-blIdz*numOfBlockx * numOfBlocky )/(numOfBlockx );
-      int blIdx = (i-blIdz*numOfBlockx * numOfBlocky )%( numOfBlockx );
-      //std::cout << "blIdx = " << blIdx << " ,blIdy = " << blIdy << std::endl;
-      
-      if( numOfBlockx - 1 == blIdx )
-        xkolik = dimX - (blIdx)*numThreadsPerBlock+1;
-      if( numOfBlocky -1 == blIdy )
-        ykolik = dimY - (blIdy)*numThreadsPerBlock+1;
-      if( numOfBlockz-1 == blIdz )
-        zkolik = dimZ - (blIdz)*numThreadsPerBlock+1;
-      //std::cout << "xkolik = " << xkolik << " ,ykolik = " << ykolik << std::endl;
-      
-      
-      /*bool changed[numThreadsPerBlock*numThreadsPerBlock];
-       changed[ 0 ] = 1;*/
-      Real hx = mesh.getSpaceSteps().x();
-      Real hy = mesh.getSpaceSteps().y();
-      Real hz = mesh.getSpaceSteps().z();
-      
-      bool changed = false;
-      BlockIterHost[ i ] = 0;
-      
-      
-      Real *sArray;
-      sArray = new Real[ sizeSArray * sizeSArray * sizeSArray ];
-      if( sArray == nullptr )
-        std::cout << "Error while allocating memory for sArray." << std::endl;
-      
-      for( IndexType k = 0; k < sizeSArray; k++ )
-        for( IndexType l = 0; l < sizeSArray; l++ )
-          for( IndexType m = 0; m < sizeSArray; m++ ){
-            sArray[ m * sizeSArray * sizeSArray + k * sizeSArray + l ] = std::numeric_limits< Real >::max();
-          }
-      
-      
-      for( IndexType thrk = 0; thrk < numThreadsPerBlock; thrk++ )
-        for( IndexType thrj = 0; thrj < numThreadsPerBlock; thrj++ )
-        {
-          if( blIdx != 0 && thrj+1 < ykolik && thrk+1 < zkolik )
-            sArray[(thrk+1 )* sizeSArray * sizeSArray + (thrj+1)*sizeSArray + 0] = 
-                    aux[ blIdz*numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock*dimX + blIdx*numThreadsPerBlock + thrj * dimX -1 + thrk*dimX*dimY ];
-          
-          if( dimX > (blIdx+1) * numThreadsPerBlock && thrj+1 < ykolik && thrk+1 < zkolik )
-            sArray[ (thrk+1) * sizeSArray * sizeSArray + (thrj+1) *sizeSArray + xkolik ] = 
-                    aux[ blIdz*numThreadsPerBlock * dimX * dimY + blIdy *numThreadsPerBlock*dimX+ blIdx*numThreadsPerBlock + numThreadsPerBlock + thrj * dimX + thrk*dimX*dimY ];
-          
-          if( blIdy != 0 && thrj+1 < xkolik && thrk+1 < zkolik )
-            sArray[ (thrk+1) * sizeSArray * sizeSArray +0*sizeSArray + thrj+1] = 
-                    aux[ blIdz*numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock*dimX + blIdx*numThreadsPerBlock - dimX + thrj + thrk*dimX*dimY ];
-          
-          if( dimY > (blIdy+1) * numThreadsPerBlock && thrj+1 < xkolik && thrk+1 < zkolik )
-            sArray[ (thrk+1) * sizeSArray * sizeSArray + ykolik*sizeSArray + thrj+1] = 
-                    aux[ blIdz*numThreadsPerBlock * dimX * dimY + (blIdy+1) * numThreadsPerBlock*dimX + blIdx*numThreadsPerBlock + thrj + thrk*dimX*dimY ];
-          
-          if( blIdz != 0 && thrj+1 < ykolik && thrk+1 < xkolik )
-            sArray[ 0 * sizeSArray * sizeSArray +(thrj+1 )* sizeSArray + thrk+1] = 
-                    aux[ blIdz*numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock*dimX + blIdx*numThreadsPerBlock - dimX * dimY + thrj * dimX + thrk ];
-          
-          if( dimZ > (blIdz+1) * numThreadsPerBlock && thrj+1 < ykolik && thrk+1 < xkolik )
-            sArray[zkolik * sizeSArray * sizeSArray + (thrj+1) * sizeSArray + thrk+1] = 
-                    aux[ (blIdz+1)*numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock*dimX + blIdx*numThreadsPerBlock + thrj * dimX + thrk ];
-        }
-      
-      for( IndexType m = 0; m < numThreadsPerBlock; m++ ){
-        for( IndexType k = 0; k < numThreadsPerBlock; k++ ){
-          for( IndexType l = 0; l < numThreadsPerBlock; l++ ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-              sArray[(m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1] = 
-                      aux[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l ];
-          }
-        }
-      }
-      /*string s;
-      int numWhile = 0;
-      for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      for( IndexType m = 0; m < numThreadsPerBlock; m++ ){
-        for( IndexType k = 0; k < numThreadsPerBlock; k++ ){ 
-          for( IndexType l = 0; l < numThreadsPerBlock; l++ ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ ){
-              //std::cout << "proslo i = " << k * numThreadsPerBlock + l << std::endl;
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                //printf("In with point m  = %d, k = %d, l = %d\n", m, k, l);
-                changed = this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz) || changed;
-                
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      for( IndexType m = numThreadsPerBlock-1; m >-1; m-- ){
-        for( IndexType k = 0; k < numThreadsPerBlock; k++ ){
-          for( IndexType l = 0; l <numThreadsPerBlock; l++ ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      for( IndexType m = 0; m < numThreadsPerBlock; m++ ){
-        for( IndexType k = 0; k < numThreadsPerBlock; k++ ){
-          for( IndexType l = numThreadsPerBlock-1; l >-1; l-- ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );
-      */
-      for( IndexType m = numThreadsPerBlock-1; m >-1; m-- ){
-        for( IndexType k = 0; k < numThreadsPerBlock; k++ ){
-          for( IndexType l = numThreadsPerBlock-1; l >-1; l-- ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >(  sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      for( IndexType m = 0; m < numThreadsPerBlock; m++ ){
-        for( IndexType k = numThreadsPerBlock-1; k > -1; k-- ){
-          for( IndexType l = 0; l <numThreadsPerBlock; l++ ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      for( IndexType m = numThreadsPerBlock-1; m >-1; m-- ){
-        for( IndexType k = numThreadsPerBlock-1; k > -1; k-- ){
-          for( IndexType l = 0; l <numThreadsPerBlock; l++ ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      for( IndexType m = 0; m < numThreadsPerBlock; m++ ){
-        for( IndexType k = numThreadsPerBlock-1; k > -1; k-- ){
-          for( IndexType l = numThreadsPerBlock-1; l >-1; l-- ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      
-      for( IndexType m = numThreadsPerBlock-1; m >-1; m-- ){
-        for( IndexType k = numThreadsPerBlock-1; k > -1; k-- ){
-          for( IndexType l = numThreadsPerBlock-1; l >-1; l-- ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )
-            {
-              if( ! interfaceMap[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l  ] )
-              {
-                this->template updateCell3D< sizeSArray >( sArray, l+1, k+1, m+1, hx,hy,hz);
-              }
-            }
-          }
-        }
-      }
-      /*for( int k = 0; k < numThreadsPerBlock; k++ ){
-        for( int l = 0; l < numThreadsPerBlock; l++ ) 
-          for( int m = 0; m < numThreadsPerBlock; m++ )
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ )     
-              helpFunc[ m*dimX*dimY + k*dimX + l ] = sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-      } 
-      numWhile++;
-      s = "helpFunc-"+ std::to_string(numWhile) + ".tnl";
-      helpFunc.save( s );*/
-      
-      if( changed ){
-        BlockIterHost[ i ] = 1;
-      }
-      
-      
-      for( IndexType k = 0; k < numThreadsPerBlock; k++ ){ 
-        for( IndexType l = 0; l < numThreadsPerBlock; l++ ) {
-          for( IndexType m = 0; m < numThreadsPerBlock; m++ ){
-            if( blIdy * numThreadsPerBlock + k < dimY && blIdx * numThreadsPerBlock + l < dimX && blIdz * numThreadsPerBlock + m < dimZ ){      
-              helpFunc[ blIdz * numThreadsPerBlock * dimX * dimY + blIdy * numThreadsPerBlock * dimX + blIdx*numThreadsPerBlock + m*dimX*dimY + k*dimX + l ] = 
-                      sArray[ (m+1) * sizeSArray * sizeSArray + (k+1) *sizeSArray + l+1 ];
-              //std::cout << helpFunc[ m*dimX*dimY + k*dimX + l ] << " ";
-            }
-          }
-          //std::cout << std::endl;
-        }
-        //std::cout << std::endl;
-      }
-      //helpFunc.save( "helpF.tnl");
-      delete []sArray;
-    }
-  }
-}
-template< typename Real,
-        typename Device,
-        typename Index >
-void 
-tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >::
-getNeighbours( ArrayContainer& BlockIterHost, int numBlockX, int numBlockY, int numBlockZ )
-{
-  int* BlockIterPom; 
-  BlockIterPom = new int [ numBlockX * numBlockY * numBlockZ ];
-  
-  for( int i = 0; i< BlockIterHost.getSize(); i++)
-  {
-    BlockIterPom[ i ] = 0;
-    
-    int m=0, l=0, k=0;
-    l = i/( numBlockX * numBlockY );
-    k = (i-l*numBlockX * numBlockY )/(numBlockX );
-    m = (i-l*numBlockX * numBlockY )%( numBlockX );
-    
-    if( m > 0 && BlockIterHost[ i - 1 ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( m < numBlockX -1 && BlockIterHost[ i + 1 ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( k > 0 && BlockIterHost[ i - numBlockX ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( k < numBlockY -1 && BlockIterHost[ i + numBlockX ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( l > 0 && BlockIterHost[ i - numBlockX*numBlockY ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( l < numBlockZ-1 && BlockIterHost[ i + numBlockX*numBlockY ] ){
-      BlockIterPom[ i ] = 1;
-    }
-  }
-  for( int i = 0; i< BlockIterHost.getSize(); i++)
-  { 
-    BlockIterHost[ i ] = BlockIterPom[ i ];
-  }
-}
-
-
-template< typename Real,
-        typename Device,
-        typename Index >
-void 
-tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >::
-getNeighbours( ArrayContainer& BlockIterHost, int numBlockX, int numBlockY )
-{
-  int* BlockIterPom; 
-  BlockIterPom = new int [numBlockX * numBlockY];
-  
-  for(int i = 0; i < numBlockX * numBlockY; i++)
-  {
-    BlockIterPom[ i ] = 0;//BlockIterPom[ i ] = 0;
-    int m=0, k=0;
-    m = i%numBlockX;
-    k = i/numBlockX;
-    if( m > 0 && BlockIterHost[ i - 1 ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( m < numBlockX -1 && BlockIterHost[ i + 1 ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( k > 0 && BlockIterHost[ i - numBlockX ] ){
-      BlockIterPom[ i ] = 1;
-    }else if( k < numBlockY -1 && BlockIterHost[ i + numBlockX ] ){
-      BlockIterPom[ i ] = 1;
-    }
-    //BlockIterPom[ i ];
-  }
-  
-  for(int i = 0; i < numBlockX * numBlockY; i++)
-  {
-    if( !BlockIterHost[ i ] )
-      BlockIterHost[ i ] = BlockIterPom[ i ];
-  }
-  /*else
-   BlockIter[ i ] = 0;*/
-  /*for( int i = numBlockX-1; i > -1; i-- )
-   {
-   for( int j = 0; j< numBlockY; j++ )
-   std::cout << BlockIterHost[ i*numBlockY + j ];
-   std::cout << std::endl;
-   }
-   std::cout << std::endl;*/
-  delete[] BlockIterPom;
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-template< typename MeshEntity >
-void
-tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > >::
-updateCell( MeshFunctionType& u,
-        const MeshEntity& cell, 
-        const RealType v )
-{
-  const auto& neighborEntities = cell.template getNeighborEntities< 1 >();
-  const MeshType& mesh = cell.getMesh();
-  const RealType& h = mesh.getSpaceSteps().x();
-  const RealType value = u( cell );
-  RealType a, tmp = std::numeric_limits< RealType >::max();
-  
-  if( cell.getCoordinates().x() == 0 )
-    a = u[ neighborEntities.template getEntityIndex< 1 >() ];
-  else if( cell.getCoordinates().x() == mesh.getDimensions().x() - 1 )
-    a = u[ neighborEntities.template getEntityIndex< -1 >() ];
-  else
-  {
-    a = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< -1 >() ],
-            u[ neighborEntities.template getEntityIndex<  1 >() ] );
-  }
-  
-  if( fabs( a ) == std::numeric_limits< RealType >::max() )
-    return;
-  
-  tmp = a + TNL::sign( value ) * h/v;
-  
-  u[ cell.getIndex() ] = argAbsMin( value, tmp );
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-void
-tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >::
-initInterface( const MeshFunctionPointer& _input,
-        MeshFunctionPointer& _output,
-        InterfaceMapPointer& _interfaceMap, 
-        StaticVector vLower, StaticVector vUpper )
-{
-  
-  if( std::is_same< Device, Devices::Cuda >::value )
-  {
-#ifdef HAVE_CUDA
-    const MeshType& mesh = _input->getMesh();
-    
-    const int cudaBlockSize( 16 );
-    int numBlocksX = Devices::Cuda::getNumberOfBlocks( mesh.getDimensions().x(), cudaBlockSize );
-    int numBlocksY = Devices::Cuda::getNumberOfBlocks( mesh.getDimensions().y(), cudaBlockSize );
-    dim3 blockSize( cudaBlockSize, cudaBlockSize );
-    dim3 gridSize( numBlocksX, numBlocksY );
-    Devices::Cuda::synchronizeDevice();
-    CudaInitCaller<<< gridSize, blockSize >>>( _input.template getData< Device >(),
-            _output.template modifyData< Device >(),
-            _interfaceMap.template modifyData< Device >(),
-            vLower, vUpper);
-    cudaDeviceSynchronize();
-    TNL_CHECK_CUDA_DEVICE;
-#endif
-  }
-  if( std::is_same< Device, Devices::Host >::value )
-  {
-    MeshFunctionType input = _input.getData();    
-    MeshFunctionType& output = _output.modifyData();
-    InterfaceMapType& interfaceMap = _interfaceMap.modifyData();
-    const MeshType& mesh = input.getMesh();
-/*#ifdef HAVE_MPI
-    int i>s::>::GetRan>s::>::AllGroup );
-    if( i == 0 )
-    {
-      printf( "0: mesh x: %d\n", mesh.getDimensions().x() );
-      printf( "0: mesh y: %d\n", mesh.getDimensions().y() );
-      for( int k = 0; k < mesh.getDimensions().y(); k++ ){
-        for( int l = 0; l < mesh.getDimensions().x(); l++ )
-          printf( "%.2f\t", input[ k * 16 + l ] );
-        printf("\n");
-      }
-    }
-#endif*/
-    typedef typename MeshType::Cell Cell;
-    Cell cell( mesh );
-    for( cell.getCoordinates().y() = 0;
-            cell.getCoordinates().y() < mesh.getDimensions().y();
-            cell.getCoordinates().y() ++ )
-      for( cell.getCoordinates().x() = 0;
-              cell.getCoordinates().x() < mesh.getDimensions().x();
-              cell.getCoordinates().x() ++ )
-      {
-        cell.refresh();
-        output[ cell.getIndex() ] =
-                input( cell ) >= 0 ? std::numeric_limits< RealType >::max() :
-                  - std::numeric_limits< RealType >::max();
-        interfaceMap[ cell.getIndex() ] = false;
-      }
-    
-    const RealType& hx = mesh.getSpaceSteps().x();
-    const RealType& hy = mesh.getSpaceSteps().y();     
-    for( cell.getCoordinates().y() = 0 + vLower[1];
-            cell.getCoordinates().y() < mesh.getDimensions().y() - vUpper[1];
-            cell.getCoordinates().y() ++ )
-      for( cell.getCoordinates().x() = 0 + vLower[0];
-              cell.getCoordinates().x() < mesh.getDimensions().x() - vUpper[0];
-              cell.getCoordinates().x() ++ )
-      {
-        cell.refresh();
-        const RealType& c = input( cell );
-        if( ! cell.isBoundaryEntity()  )
-        {
-          auto neighbors = cell.getNeighborEntities();
-          Real pom = 0;
-          const IndexType e = neighbors.template getEntityIndex<  1,  0 >();
-          const IndexType n = neighbors.template getEntityIndex<  0,  1 >();
-          //Try init with exact data:
-          /*if( c * input[ n ] <= 0 )
-           {
-           output[ cell.getIndex() ] = c;
-           output[ n ] = input[ n ];
-           interfaceMap[ cell.getIndex() ] = true;
-           interfaceMap[ n ] = true;
-           }   
-           if( c * input[ e ] <= 0 )
-           {   
-           output[ cell.getIndex() ] = c;
-           output[ e ] = input[ e ];
-           interfaceMap[ cell.getIndex() ] = true;
-           interfaceMap[ e ] = true;
-           }*/
-          if( c * input[ n ] <= 0 )
-          {
-            /*if( c >= 0 )
-             {*/
-            pom = TNL::sign( c )*( hy * c )/( c - input[ n ]);
-            if( TNL::abs( output[ cell.getIndex() ] ) > TNL::abs( pom ) ) 
-              output[ cell.getIndex() ] = pom;
-            pom = pom - TNL::sign( c )*hy;
-            if( TNL::abs( output[ n ] ) > TNL::abs( pom ) )
-              output[ n ] = pom; //( hy * c )/( c - input[ n ]) - hy;
-            /*}else
-             {
-             pom = - ( hy * c )/( c - input[ n ]);
-             if( output[ cell.getIndex() ] < pom )
-             output[ cell.getIndex() ] = pom;
-             if( output[ n ] > hy + pom )
-             output[ n ] = hy + pom; //hy - ( hy * c )/( c - input[ n ]);
-             }*/
-            interfaceMap[ cell.getIndex() ] = true;
-            interfaceMap[ n ] = true;
-          }
-          if( c * input[ e ] <= 0 )
-          {
-            /*if( c >= 0 )
-             {*/
-            pom = TNL::sign( c )*( hx * c )/( c - input[ e ]);
-            if( TNL::abs( output[ cell.getIndex() ] ) > TNL::abs( pom ) )
-              output[ cell.getIndex() ] = pom;
-            
-            pom = pom - TNL::sign( c )*hx; //output[ e ] = (hx * c)/( c - input[ e ]) - hx;
-            if( TNL::abs( output[ e ] ) > TNL::abs( pom ) )
-              output[ e ] = pom; 
-            /*}else
-             {
-             pom = - (hx * c)/( c - input[ e ]);
-             if( output[ cell.getIndex() ] < pom )
-             output[ cell.getIndex() ] = pom;
-             
-             pom = pom + hx; //output[ e ] = hx - (hx * c)/( c - input[ e ]);
-             if( output[ e ] > pom )
-             output[ e ] = pom;
-             }*/
-            interfaceMap[ cell.getIndex() ] = true;
-            interfaceMap[ e ] = true;
-          }
-        }
-      }
-#ifdef HAVE_MPI
-    //int i>s::>::GetRan>s::>::AllGroup );
-    /*if( i == 0 )
-    {
-      printf( "0: mesh x: %d\n", mesh.getDimensions().x() );
-      printf( "0: mesh y: %d\n", mesh.getDimensions().y() );
-      for( int k = 0; k < mesh.getDimensions().y(); k++ ){
-        for( int l = 0; l < mesh.getDimensions().x(); l++ )
-          printf("%.2f\t",output[ k * 16 + l ] );
-        printf("\n");
-      }
-    }*/
-#endif
-  }
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-template< typename MeshEntity >
-__cuda_callable__
-bool
-tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >::
-updateCell( MeshFunctionType& u,
-        const MeshEntity& cell,   
-        const RealType v)
-{
-  const auto& neighborEntities = cell.template getNeighborEntities< 2 >();
-  const MeshType& mesh = cell.getMesh();
-  const RealType& hx = mesh.getSpaceSteps().x();
-  const RealType& hy = mesh.getSpaceSteps().y();
-  const RealType value = u( cell );
-  RealType a, b, tmp = std::numeric_limits< RealType >::max();
-  
-  if( cell.getCoordinates().x() == 0 )
-    a = u[ neighborEntities.template getEntityIndex< 1,  0 >() ];
-  else if( cell.getCoordinates().x() == mesh.getDimensions().x() - 1 )
-    a = u[ neighborEntities.template getEntityIndex< -1,  0 >() ];
-  else
-  {
-    a = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< -1,  0 >() ],
-            u[ neighborEntities.template getEntityIndex<  1,  0 >() ] );
-  }
-  
-  if( cell.getCoordinates().y() == 0 )
-    b = u[ neighborEntities.template getEntityIndex< 0,  1 >()];
-  else if( cell.getCoordinates().y() == mesh.getDimensions().y() - 1 )
-    b = u[ neighborEntities.template getEntityIndex< 0,  -1 >() ];
-  else
-  {
-    b = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< 0,  -1 >() ],
-            u[ neighborEntities.template getEntityIndex< 0,   1 >() ] );
-  }
-  if( fabs( a ) == std::numeric_limits< RealType >::max() && 
-          fabs( b ) == std::numeric_limits< RealType >::max() )
-    return false;
-  
-  RealType pom[6] = { a, b, std::numeric_limits< RealType >::max(), (RealType)hx, (RealType)hy, 0.0 };
-  sortMinims( pom );
-  tmp = pom[ 0 ] + TNL::sign( value ) * pom[ 3 ]/v;
-  
-  if( fabs( tmp ) < fabs( pom[ 1 ] ) ) 
-  {
-    u[ cell.getIndex() ] = argAbsMin( value, tmp );
-    tmp = value - u[ cell.getIndex() ];
-    if ( fabs( tmp ) >  0.001*hx ){
-      //printf( "Vracime true!\n");
-      return true;
-    }else{
-      //printf( "Vracime false2!\n");
-      return false;
-    }
-  }
-  else {
-    tmp = ( pom[ 3 ] * pom[ 3 ] * pom[ 1 ] + pom[ 4 ] * pom[ 4 ] * pom[ 0 ] + 
-            TNL::sign( value ) * pom[ 3 ] * pom[ 4 ] * TNL::sqrt( ( pom[ 3 ] * pom[ 3 ] +  pom[ 4 ] *  pom[ 4 ] )/( v * v ) - 
-            ( pom[ 1 ] - pom[ 0 ] ) * ( pom[ 1 ] - pom[ 0 ] ) ) )/( pom[ 3 ] * pom[ 3 ] + pom[ 4 ] * pom[ 4 ] );
-    u[ cell.getIndex() ] = argAbsMin( value, tmp );
-    tmp = value - u[ cell.getIndex() ];
-    if ( fabs( tmp ) > 0.001*hx ){
-      //printf( "Vracime true3!\n");
-      return true;
-    }else{
-      //printf( "Vracime false!\n");
-      return false;
-    }
-  }
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-void
-tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >::
-initInterface( const MeshFunctionPointer& _input,
-        MeshFunctionPointer& _output,
-        InterfaceMapPointer& _interfaceMap, 
-        StaticVector vLower, StaticVector vUpper )
-{
-  if( std::is_same< Device, Devices::Cuda >::value )
-  {
-#ifdef HAVE_CUDA
-    const MeshType& mesh = _input->getMesh();
-   
-    const int cudaBlockSize( 8 );
-    int numBlocksX = Devices::Cuda::getNumberOfBlocks( mesh.getDimensions().x(), cudaBlockSize );
-    int numBlocksY = Devices::Cuda::getNumberOfBlocks( mesh.getDimensions().y(), cudaBlockSize );
-    int numBlocksZ = Devices::Cuda::getNumberOfBlocks( mesh.getDimensions().z(), cudaBlockSize );
-    if( cudaBlockSize * cudaBlockSize * cudaBlockSize > 1024 || numBlocksX > 1024 || numBlocksY > 1024 || numBlocksZ > 64 )
-      std::cout << "Invalid kernel call. Dimensions of grid are max: [1024,1024,64], and maximum threads per block are 1024!" << std::endl;
-    dim3 blockSize( cudaBlockSize, cudaBlockSize, cudaBlockSize );
-    dim3 gridSize( numBlocksX, numBlocksY, numBlocksZ );
-    Devices::Cuda::synchronizeDevice();
-    CudaInitCaller3d<<< gridSize, blockSize >>>( _input.template getData< Device >(),
-            _output.template modifyData< Device >(),
-            _interfaceMap.template modifyData< Device >(), vLower, vUpper );
-    cudaDeviceSynchronize();
-    TNL_CHECK_CUDA_DEVICE;
-#endif
-  }
-  if( std::is_same< Device, Devices::Host >::value )
-  {
-    const MeshFunctionType& input =  _input.getData();
-    MeshFunctionType& output =  _output.modifyData();
-    InterfaceMapType& interfaceMap =  _interfaceMap.modifyData();
-    
-    const MeshType& mesh = input.getMesh();
-    typedef typename MeshType::Cell Cell;
-    
-    Cell cell( mesh );
-    for( cell.getCoordinates().z() = 0;
-            cell.getCoordinates().z() < mesh.getDimensions().z();
-            cell.getCoordinates().z() ++ )
-      for( cell.getCoordinates().y() = 0;
-              cell.getCoordinates().y() < mesh.getDimensions().y();
-              cell.getCoordinates().y() ++ )
-        for( cell.getCoordinates().x() = 0;
-                cell.getCoordinates().x() < mesh.getDimensions().x();
-                cell.getCoordinates().x() ++ )
-        {
-          cell.refresh();
-          output[ cell.getIndex() ] =
-                  input( cell ) > 0 ? std::numeric_limits< RealType >::max() :
-                    - std::numeric_limits< RealType >::max();
-          interfaceMap[ cell.getIndex() ] = false;
-        }
-    
-    const RealType& hx = mesh.getSpaceSteps().x();
-    const RealType& hy = mesh.getSpaceSteps().y();
-    const RealType& hz = mesh.getSpaceSteps().z();
-    for( cell.getCoordinates().z() = 0 + vLower[2];
-            cell.getCoordinates().z() < mesh.getDimensions().z() - vUpper[2];
-            cell.getCoordinates().z() ++ )   
-      for( cell.getCoordinates().y() = 0 + vLower[1];
-              cell.getCoordinates().y() < mesh.getDimensions().y() - vUpper[1];
-              cell.getCoordinates().y() ++ )
-        for( cell.getCoordinates().x() = 0 + vLower[0];
-                cell.getCoordinates().x() < mesh.getDimensions().x() - vUpper[0];
-                cell.getCoordinates().x() ++ )
-        {
-          cell.refresh();
-          const RealType& c = input( cell );
-          if( ! cell.isBoundaryEntity() )
-          {
-            auto neighbors = cell.getNeighborEntities();
-            Real pom = 0;
-            const IndexType e = neighbors.template getEntityIndex<  1,  0,  0 >();
-            const IndexType n = neighbors.template getEntityIndex<  0,  1,  0 >();
-            const IndexType t = neighbors.template getEntityIndex<  0,  0,  1 >();
-            
-            
-            if( c * input[ n ] <= 0 )
-            {
-              pom = TNL::sign( c )*( hy * c )/( c - input[ n ]);
-              if( TNL::abs( output[ cell.getIndex() ] ) > TNL::abs( pom ) ) 
-                output[ cell.getIndex() ] = pom;
-              pom = pom - TNL::sign( c )*hy;
-              if( TNL::abs( output[ n ] ) > TNL::abs( pom ) )
-                output[ n ] = pom; //( hy * c )/( c - input[ n ]) - hy;
-              
-              interfaceMap[ cell.getIndex() ] = true;
-              interfaceMap[ n ] = true;
-            }
-            
-            if( c * input[ e ] <= 0 )
-            {
-              pom = TNL::sign( c )*( hx * c )/( c - input[ e ]);
-              if( TNL::abs( output[ cell.getIndex() ] ) > TNL::abs( pom ) ) 
-                output[ cell.getIndex() ] = pom;
-              pom = pom - TNL::sign( c )*hx;
-              if( TNL::abs( output[ e ] ) > TNL::abs( pom ) )
-                output[ e ] = pom; //( hy * c )/( c - input[ n ]) - hy;
-              
-              interfaceMap[ cell.getIndex() ] = true;
-              interfaceMap[ e ] = true;
-            }
-            
-            if( c * input[ t ] <= 0 )
-            {
-              pom = TNL::sign( c )*( hz * c )/( c - input[ t ]);
-              if( TNL::abs( output[ cell.getIndex() ] ) > TNL::abs( pom ) ) 
-                output[ cell.getIndex() ] = pom;
-              pom = pom - TNL::sign( c )*hz;
-              if( TNL::abs( output[ t ] ) > TNL::abs( pom ) )
-                output[ t ] = pom; //( hy * c )/( c - input[ n ]) - hy;
-              
-              interfaceMap[ cell.getIndex() ] = true;
-              interfaceMap[ t ] = true;
-            }  
-          }
-        }
-  }
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-template< typename MeshEntity >
-__cuda_callable__
-bool
-tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >::
-updateCell( MeshFunctionType& u,
-        const MeshEntity& cell, 
-        const RealType v )
-{
-  const auto& neighborEntities = cell.template getNeighborEntities< 3 >();
-  const MeshType& mesh = cell.getMesh();
-  
-  const RealType& hx = mesh.getSpaceSteps().x();
-  const RealType& hy = mesh.getSpaceSteps().y();
-  const RealType& hz = mesh.getSpaceSteps().z();
-  const RealType value = u( cell );
-  //std::cout << value << std::endl;
-  RealType a, b, c, tmp = std::numeric_limits< RealType >::max();
-  
-  
-  if( cell.getCoordinates().x() == 0 )
-    a = u[ neighborEntities.template getEntityIndex< 1, 0, 0 >() ];
-  else if( cell.getCoordinates().x() == mesh.getDimensions().x() - 1 )
-    a = u[ neighborEntities.template getEntityIndex< -1, 0, 0 >() ];
-  else
-  {
-    a = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< -1, 0, 0 >() ],
-            u[ neighborEntities.template getEntityIndex< 1, 0, 0 >() ] );
-  }
-  
-  if( cell.getCoordinates().y() == 0 )
-    b = u[ neighborEntities.template getEntityIndex< 0, 1, 0 >() ];
-  else if( cell.getCoordinates().y() == mesh.getDimensions().y() - 1 )
-    b = u[ neighborEntities.template getEntityIndex< 0, -1, 0 >() ];
-  else
-  {
-    b = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< 0, -1, 0 >() ],
-            u[ neighborEntities.template getEntityIndex< 0, 1, 0 >() ] );
-  }
-  
-  if( cell.getCoordinates().z() == 0 )
-    c = u[ neighborEntities.template getEntityIndex< 0, 0, 1 >() ];
-  else if( cell.getCoordinates().z() == mesh.getDimensions().z() - 1 )
-    c = u[ neighborEntities.template getEntityIndex< 0, 0, -1 >() ];
-  else
-  {
-    c = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< 0, 0, -1 >() ],
-            u[ neighborEntities.template getEntityIndex< 0, 0, 1 >() ] );
-  }
-  
-  if( fabs( a ) == std::numeric_limits< RealType >::max() && 
-          fabs( b ) == std::numeric_limits< RealType >::max() &&
-          fabs( c ) == std::numeric_limits< RealType >::max() )
-    return false;
-  
-  RealType pom[6] = { a, b, c, (RealType)hx, (RealType)hy, (RealType)hz};
-  sortMinims( pom );   
-  tmp = pom[ 0 ] + TNL::sign( value ) * pom[ 3 ];
-  
-  if( fabs( tmp ) < fabs( pom[ 1 ] ) )
-  {
-    u[ cell.getIndex() ] = argAbsMin( value, tmp );
-    tmp = value - u[ cell.getIndex() ];
-    if ( fabs( tmp ) > 0.001*hx ){
-      return true;
-    }else{
-      return false;
-    }
-  }
-  else
-  {
-    tmp = ( pom[ 3 ] * pom[ 3 ] * pom[ 1 ] + pom[ 4 ] * pom[ 4 ] * pom[ 0 ] + 
-            TNL::sign( value ) * pom[ 3 ] * pom[ 4 ] * TNL::sqrt( ( pom[ 3 ] * pom[ 3 ] +  pom[ 4 ] *  pom[ 4 ] )/( v * v ) - 
-            ( pom[ 1 ] - pom[ 0 ] ) * ( pom[ 1 ] - pom[ 0 ] ) ) )/( pom[ 3 ] * pom[ 3 ] + pom[ 4 ] * pom[ 4 ] );
-    if( fabs( tmp ) < fabs( pom[ 2 ]) ) 
-    {
-      u[ cell.getIndex() ] = argAbsMin( value, tmp );
-      tmp = value - u[ cell.getIndex() ];
-      if ( fabs( tmp ) > 0.001*hx ){
-        return true;
-      }else{
-        return false;
-      }
-    }
-    else
-    {
-      tmp = ( hy * hy * hz * hz * a + hx * hx * hz * hz * b + hx * hx * hy * hy * c +
-              TNL::sign( value ) * hx * hy * hz * TNL::sqrt( ( hx * hx * hz * hz + hy * hy * hz * hz + hx * hx * hy * hy)/( v * v ) - 
-              hz * hz * ( a - b ) * ( a - b ) - hy * hy * ( a - c ) * ( a - c ) -
-              hx * hx * ( b - c ) * ( b - c ) ) )/( hx * hx * hy * hy + hy * hy * hz * hz + hz * hz * hx *hx );
-      u[ cell.getIndex() ] = argAbsMin( value, tmp );
-      tmp = value - u[ cell.getIndex() ];
-      if ( fabs( tmp ) > 0.001*hx ){
-        return true;
-      }else{
-        return false;
-      }
-    }
-  }
-}
-
-template < typename T1 >
-__cuda_callable__ void sortMinims( T1 pom[] )
-{
-  T1 tmp[6] = {0.0,0.0,0.0,0.0,0.0,0.0}; 
-  if( fabs(pom[0]) <= fabs(pom[1]) && fabs(pom[1]) <= fabs(pom[2])){
-    tmp[0] = pom[0]; tmp[1] = pom[1]; tmp[2] = pom[2];
-    tmp[3] = pom[3]; tmp[4] = pom[4]; tmp[5] = pom[5];
-    
-  }
-  else if( fabs(pom[0]) <= fabs(pom[2]) && fabs(pom[2]) <= fabs(pom[1]) ){
-    tmp[0] = pom[0]; tmp[1] = pom[2]; tmp[2] = pom[1];
-    tmp[3] = pom[3]; tmp[4] = pom[5]; tmp[5] = pom[4];
-  }
-  else if( fabs(pom[1]) <= fabs(pom[0]) && fabs(pom[0]) <= fabs(pom[2]) ){
-    tmp[0] = pom[1]; tmp[1] = pom[0]; tmp[2] = pom[2];
-    tmp[3] = pom[4]; tmp[4] = pom[3]; tmp[5] = pom[5];
-  }
-  else if( fabs(pom[1]) <= fabs(pom[2]) && fabs(pom[2]) <= fabs(pom[0]) ){
-    tmp[0] = pom[1]; tmp[1] = pom[2]; tmp[2] = pom[0];
-    tmp[3] = pom[4]; tmp[4] = pom[5]; tmp[5] = pom[3];
-  }
-  else if( fabs(pom[2]) <= fabs(pom[0]) && fabs(pom[0]) <= fabs(pom[1]) ){
-    tmp[0] = pom[2]; tmp[1] = pom[0]; tmp[2] = pom[1];
-    tmp[3] = pom[5]; tmp[4] = pom[3]; tmp[5] = pom[4];
-  }
-  else if( fabs(pom[2]) <= fabs(pom[1]) && fabs(pom[1]) <= fabs(pom[0]) ){
-    tmp[0] = pom[2]; tmp[1] = pom[1]; tmp[2] = pom[0];
-    tmp[3] = pom[5]; tmp[4] = pom[4]; tmp[5] = pom[3];
-  }
-  
-  for( unsigned int i = 0; i < 6; i++ )
-  {
-    pom[ i ] = tmp[ i ];
-  }   
-}
-
-template< typename Real,
-        typename Device,
-        typename Index >
-template< int sizeSArray >
-__cuda_callable__
-bool
-tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >::
-updateCell( volatile Real *sArray, int thri, int thrj, const Real hx, const Real hy,
-        const Real v )
-{
-  const RealType value = sArray[ thrj * sizeSArray + thri ];
-  RealType a, b, tmp = std::numeric_limits< RealType >::max();
-  
-  b = TNL::argAbsMin( sArray[ (thrj+1) * sizeSArray + thri ],
-          sArray[ (thrj-1) * sizeSArray + thri ] );
-  
-  a = TNL::argAbsMin( sArray[ thrj * sizeSArray + thri+1 ],
-          sArray[ thrj * sizeSArray + thri-1 ] );
-  
-  if( fabs( a ) == std::numeric_limits< RealType >::max() && 
-          fabs( b ) == std::numeric_limits< RealType >::max() )
-    return false;
-  
-  RealType pom[6] = { a, b, std::numeric_limits< RealType >::max(), (RealType)hx, (RealType)hy, 0.0 };
-  sortMinims( pom );
-  tmp = pom[ 0 ] + TNL::sign( value ) * pom[ 3 ]/v;
-  
-  
-  if( fabs( tmp ) < fabs( pom[ 1 ] ) ) 
-  {
-    sArray[ thrj * sizeSArray + thri ] = argAbsMin( value, tmp );
-    tmp = value - sArray[ thrj * sizeSArray + thri ];
-    if ( fabs( tmp ) >  0.001*hx )
-      return true;
-    else
-      return false;
-  }
-  else
-  {
-    tmp = ( pom[ 3 ] * pom[ 3 ] * pom[ 1 ] + pom[ 4 ] * pom[ 4 ] * pom[ 0 ] + 
-            TNL::sign( value ) * pom[ 3 ] * pom[ 4 ] * TNL::sqrt( ( pom[ 3 ] * pom[ 3 ] +  pom[ 4 ] *  pom[ 4 ] )/( v * v ) - 
-            ( pom[ 1 ] - pom[ 0 ] ) * ( pom[ 1 ] - pom[ 0 ] ) ) )/( pom[ 3 ] * pom[ 3 ] + pom[ 4 ] * pom[ 4 ] );
-    sArray[ thrj * sizeSArray + thri ] = argAbsMin( value, tmp );
-    tmp = value - sArray[ thrj * sizeSArray + thri ];
-    if ( fabs( tmp ) > 0.001*hx )
-      return true;
-    else
-      return false;
-  }
-  
-  return false;
-}
-template< typename Real,
-        typename Device,
-        typename Index >
-template< int sizeSArray >
-__cuda_callable__ 
-bool 
-tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >::
-updateCell3D( volatile Real *sArray, int thri, int thrj, int thrk,
-        const Real hx, const Real hy, const Real hz, const Real v )
-{
-  const RealType value = sArray[thrk *sizeSArray * sizeSArray + thrj * sizeSArray + thri];
-  
-  RealType a, b, c, tmp = std::numeric_limits< RealType >::max();
-  
-  c = TNL::argAbsMin( sArray[ (thrk+1)* sizeSArray*sizeSArray + thrj * sizeSArray + thri ],
-          sArray[ (thrk-1) * sizeSArray *sizeSArray + thrj* sizeSArray + thri ] );
-  
-  b = TNL::argAbsMin( sArray[ thrk* sizeSArray*sizeSArray + (thrj+1) * sizeSArray + thri ],
-          sArray[ thrk* sizeSArray * sizeSArray + (thrj-1)* sizeSArray +thri ] );
-  
-  a = TNL::argAbsMin( sArray[ thrk* sizeSArray* sizeSArray  + thrj* sizeSArray + thri+1 ],
-          sArray[ thrk* sizeSArray * sizeSArray + thrj* sizeSArray +thri-1 ] );
-  
-  /*if( thrk == 8 )
-    printf("Calculating a = %f, b = %f, c = %f\n" , a, b, c );*/
-  
-  if( fabs( a ) == std::numeric_limits< RealType >::max() && 
-          fabs( b ) == std::numeric_limits< RealType >::max() &&
-          fabs( c ) == std::numeric_limits< RealType >::max() )
-    return false;
-  
-  RealType pom[6] = { a, b, c, (RealType)hx, (RealType)hy, (RealType)hz};
-  
-  sortMinims( pom );
-  
-  tmp = pom[ 0 ] + TNL::sign( value ) * pom[ 3 ];
-  if( fabs( tmp ) < fabs( pom[ 1 ] ) ) 
-  {
-    sArray[ thrk* sizeSArray* sizeSArray + thrj* sizeSArray + thri ] = argAbsMin( value, tmp );
-    tmp = value - sArray[ thrk* sizeSArray* sizeSArray  + thrj* sizeSArray + thri ];
-    if ( fabs( tmp ) >  0.001*hx )
-      return true;
-    else
-      return false;
-  }
-  else
-  {
-    tmp = ( pom[ 3 ] * pom[ 3 ] * pom[ 1 ] + pom[ 4 ] * pom[ 4 ] * pom[ 0 ] + 
-            TNL::sign( value ) * pom[ 3 ] * pom[ 4 ] * TNL::sqrt( ( pom[ 3 ] * pom[ 3 ] +  pom[ 4 ] *  pom[ 4 ] )/( v * v ) - 
-            ( pom[ 1 ] - pom[ 0 ] ) * ( pom[ 1 ] - pom[ 0 ] ) ) )/( pom[ 3 ] * pom[ 3 ] + pom[ 4 ] * pom[ 4 ] );
-    if( fabs( tmp ) < fabs( pom[ 2 ]) ) 
-    {
-      sArray[ thrk* sizeSArray* sizeSArray  + thrj* sizeSArray + thri ] = argAbsMin( value, tmp );
-      tmp = value - sArray[ thrk* sizeSArray* sizeSArray  + thrj* sizeSArray + thri ];
-      if ( fabs( tmp ) > 0.001*hx )
-        return true;
-      else
-        return false;
-    }
-    else
-    {
-      tmp = ( hy * hy * hz * hz * a + hx * hx * hz * hz * b + hx * hx * hy * hy * c +
-              TNL::sign( value ) * hx * hy * hz * TNL::sqrt( ( hx * hx * hz * hz + hy * hy * hz * hz + hx * hx * hy * hy)/( v * v ) - 
-              hz * hz * ( a - b ) * ( a - b ) - hy * hy * ( a - c ) * ( a - c ) -
-              hx * hx * ( b - c ) * ( b - c ) ) )/( hx * hx * hy * hy + hy * hy * hz * hz + hz * hz * hx *hx );
-      sArray[ thrk* sizeSArray* sizeSArray  + thrj* sizeSArray + thri ] = argAbsMin( value, tmp );
-      tmp = value - sArray[ thrk* sizeSArray* sizeSArray  + thrj* sizeSArray + thri ];
-      if ( fabs( tmp ) > 0.001*hx )
-        return true;
-      else
-        return false;
-    }
-  }
-  
-  return false;
-}
-
-#ifdef HAVE_CUDA
-template < typename Real, typename Device, typename Index >
-__global__ void CudaInitCaller( const Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index > >& input, 
-        Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index > >& output,
-        Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index >, 1, bool >& interfaceMap )
-{
-  int i = threadIdx.x + blockDim.x*blockIdx.x;
-  const Meshes::Grid< 1, Real, Device, Index >& mesh = input.template getMesh< Devices::Cuda >();
-  
-  if( i < mesh.getDimensions().x()  )
-  {
-    typedef typename Meshes::Grid< 1, Real, Device, Index >::Cell Cell;
-    Cell cell( mesh );
-    cell.getCoordinates().x() = i;
-    cell.refresh();
-    const Index cind = cell.getIndex();
-    
-    
-    output[ cind ] =
-            input( cell ) >= 0 ? std::numeric_limits< Real >::max() :
-              - std::numeric_limits< Real >::max();
-    interfaceMap[ cind ] = false; 
-    
-    const Real& h = mesh.getSpaceSteps().x();
-    cell.refresh();
-    const Real& c = input( cell );
-    if( ! cell.isBoundaryEntity()  )
-    {
-      auto neighbors = cell.getNeighborEntities();
-      Real pom = 0;
-      const Index e = neighbors.template getEntityIndex< 1 >();
-      const Index w = neighbors.template getEntityIndex< -1 >();
-      if( c * input[ e ] <= 0 )
-      {
-        pom = TNL::sign( c )*( h * c )/( c - input[ e ]);
-        if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) )
-          output[ cind ] = pom;                       
-        
-        interfaceMap[ cind ] = true;
-      }
-      if( c * input[ w ] <= 0 )
-      {
-        pom = TNL::sign( c )*( h * c )/( c - input[ w ]);
-        if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-          output[ cind ] = pom;
-        
-        interfaceMap[ cind ] = true;
-      }
-    }
-  }
-  
-}
-template < typename Real, typename Device, typename Index >
-__global__ void CudaInitCaller( const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& input, 
-        Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& output,
-        Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap,
-        Containers::StaticVector< 2, Index > vLower, Containers::StaticVector< 2, Index > vUpper ) 
-{
-  int i = threadIdx.x + blockDim.x*blockIdx.x;
-  int j = blockDim.y*blockIdx.y + threadIdx.y;
-  const Meshes::Grid< 2, Real, Device, Index >& mesh = input.template getMesh< Devices::Cuda >();
-  
-  if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() )
-  {
-    typedef typename Meshes::Grid< 2, Real, Device, Index >::Cell Cell;
-    Cell cell( mesh );
-    cell.getCoordinates().x() = i; cell.getCoordinates().y() = j;
-    cell.refresh();
-    const Index cind = cell.getIndex();
-    
-    
-    output[ cind ] =
-            input( cell ) >= 0 ? std::numeric_limits< Real >::max() :
-              - std::numeric_limits< Real >::max();
-    interfaceMap[ cind ] = false; 
-    
-    if( i < mesh.getDimensions().x() - vUpper[0] && j < mesh.getDimensions().y() - vUpper[1] && i>vLower[0] -1 && j> vLower[0]-1 )
-    {
-      const Real& hx = mesh.getSpaceSteps().x();
-      const Real& hy = mesh.getSpaceSteps().y();
-      cell.refresh();
-      const Real& c = input( cell );
-      if( ! cell.isBoundaryEntity()  )
-      {
-        auto neighbors = cell.getNeighborEntities();
-        Real pom = 0;
-        const Index e = neighbors.template getEntityIndex<  1,  0 >();
-        const Index w = neighbors.template getEntityIndex<  -1,  0 >();
-        const Index n = neighbors.template getEntityIndex<  0,  1 >();
-        const Index s = neighbors.template getEntityIndex<  0,  -1 >();
-        
-        if( c * input[ n ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hy * c )/( c - input[ n ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cell.getIndex() ] = true;
-        }
-        if( c * input[ e ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hx * c )/( c - input[ e ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) )
-            output[ cind ] = pom;                       
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ w ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hx * c )/( c - input[ w ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ s ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hy * c )/( c - input[ s ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-      }
-    }
-  }
-}
-
-template < typename Real, typename Device, typename Index >
-__global__ void CudaInitCaller3d( const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& input, 
-        Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& output,
-        Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap,
-        Containers::StaticVector< 3, Index > vLower, Containers::StaticVector< 3, Index > vUpper )
-{
-  int i = threadIdx.x + blockDim.x*blockIdx.x;
-  int j = blockDim.y*blockIdx.y + threadIdx.y;
-  int k = blockDim.z*blockIdx.z + threadIdx.z;
-  const Meshes::Grid< 3, Real, Device, Index >& mesh = input.template getMesh< Devices::Cuda >();
-  
-  if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && k < mesh.getDimensions().z() )
-  {
-    typedef typename Meshes::Grid< 3, Real, Device, Index >::Cell Cell;
-    Cell cell( mesh );
-    cell.getCoordinates().x() = i; cell.getCoordinates().y() = j; cell.getCoordinates().z() = k;
-    cell.refresh();
-    const Index cind = cell.getIndex();
-    
-    
-    output[ cind ] =
-            input( cell ) >= 0 ? std::numeric_limits< Real >::max() :
-              - std::numeric_limits< Real >::max();
-    interfaceMap[ cind ] = false; 
-    cell.refresh();
-    
-    if( i < mesh.getDimensions().x() - vUpper[0] && j < mesh.getDimensions().y() - vUpper[1] &&
-            k < mesh.getDimensions().y() - vUpper[2] && i>vLower[0]-1 && j> vLower[1]-1 && k>vLower[2]-1 )
-    {
-      const Real& hx = mesh.getSpaceSteps().x();
-      const Real& hy = mesh.getSpaceSteps().y();
-      const Real& hz = mesh.getSpaceSteps().z();
-      const Real& c = input( cell );
-      if( ! cell.isBoundaryEntity()  )
-      {
-        auto neighbors = cell.getNeighborEntities();
-        Real pom = 0;
-        const Index e = neighbors.template getEntityIndex<  1, 0, 0 >();
-        const Index w = neighbors.template getEntityIndex<  -1, 0, 0 >();
-        const Index n = neighbors.template getEntityIndex<  0, 1, 0 >();
-        const Index s = neighbors.template getEntityIndex<  0, -1, 0 >();
-        const Index t = neighbors.template getEntityIndex<  0, 0, 1 >();
-        const Index b = neighbors.template getEntityIndex<  0, 0, -1 >();
-        
-        if( c * input[ n ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hy * c )/( c - input[ n ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ e ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hx * c )/( c - input[ e ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) )
-            output[ cind ] = pom;                       
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ w ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hx * c )/( c - input[ w ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ s ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hy * c )/( c - input[ s ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ b ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hz * c )/( c - input[ b ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-        if( c * input[ t ] <= 0 )
-        {
-          pom = TNL::sign( c )*( hz * c )/( c - input[ t ]);
-          if( TNL::abs( output[ cind ] ) > TNL::abs( pom ) ) 
-            output[ cind ] = pom;
-          
-          interfaceMap[ cind ] = true;
-        }
-      }
-    }
-  }
-}
-
-
-template< typename Real,
-        typename Device,
-        typename Index >
-__cuda_callable__
-bool
-tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > >::
-updateCell( volatile Real sArray[18], int thri, const Real h, const Real v )
-{
-  const RealType value = sArray[ thri ];
-  RealType a, tmp = std::numeric_limits< RealType >::max();
-  
-  a = TNL::argAbsMin( sArray[ thri+1 ],
-          sArray[ thri-1 ] );
-  
-  if( fabs( a ) == std::numeric_limits< RealType >::max() )
-    return false;
-  
-  tmp = a + TNL::sign( value ) * h/v;
-  
-  
-  sArray[ thri ] = argAbsMin( value, tmp );
-  
-  tmp = value - sArray[ thri ];
-  if ( fabs( tmp ) >  0.001*h )
-    return true;
-  else
-    return false;
-}
-#endif
-- 
GitLab