diff --git a/src/Examples/narrow-band/CMakeLists.txt b/src/Examples/narrow-band/CMakeLists.txt deleted file mode 100644 index 158cd20132ed4f499228cda7400ba18776dc1503..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -set( tnl_narrow_band_SOURCES -# MainBuildConfig.h -# tnlNarrowBand2D_impl.h -# tnlNarrowBand.h -# narrowBandConfig.h - main.cpp) - - -IF( BUILD_CUDA ) - CUDA_ADD_EXECUTABLE(narrow-band main.cu) -ELSE( BUILD_CUDA ) - ADD_EXECUTABLE(narrow-band main.cpp) -ENDIF( BUILD_CUDA ) -target_link_libraries (narrow-band tnl ) - - -INSTALL( TARGETS narrow-band - RUNTIME DESTINATION bin - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) - -#INSTALL( FILES ${tnl_narrow_band_SOURCES} -# DESTINATION ${TNL_TARGET_DATA_DIRECTORY}/examples/narrow-band ) diff --git a/src/Examples/narrow-band/MainBuildConfig.h b/src/Examples/narrow-band/MainBuildConfig.h deleted file mode 100644 index ed3d686eb99379af1589d734eac9b5812cccdedf..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/MainBuildConfig.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - MainBuildConfig.h - description - ------------------- - begin : Jul 7, 2014 - copyright : (C) 2014 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef MAINBUILDCONFIG_H_ -#define MAINBUILDCONFIG_H_ - -#include <solvers/tnlBuildConfigTags.h> - -class MainBuildConfig -{ - public: - - static void print() {std::cerr << "MainBuildConfig" <<std::endl; } -}; - -/**** - * Turn off support for float and long double. - */ -template<> struct tnlConfigTagReal< MainBuildConfig, float > { enum { enabled = false }; }; -template<> struct tnlConfigTagReal< MainBuildConfig, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct tnlConfigTagIndex< MainBuildConfig, short int >{ enum { enabled = false }; }; -template<> struct tnlConfigTagIndex< MainBuildConfig, long int >{ enum { enabled = false }; }; - -/**** - * Use of tnlGrid is enabled for allowed dimensions and Real, Device and Index types. - */ -template< int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< MainBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< MainBuildConfig, Dimensions >::enabled && - tnlConfigTagReal< MainBuildConfig, Real >::enabled && - tnlConfigTagDevice< MainBuildConfig, Device >::enabled && - tnlConfigTagIndex< MainBuildConfig, Index >::enabled }; }; - -/**** - * Please, chose your preferred time discretisation here. - */ -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = false}; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; - -/**** - * Only the Runge-Kutta-Merson solver is enabled by default. - */ -template<> struct tnlConfigTagExplicitSolver< MainBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; - -#endif /* MAINBUILDCONFIG_H_ */ diff --git a/src/Examples/narrow-band/main.cpp b/src/Examples/narrow-band/main.cpp deleted file mode 100644 index 8849008ff630db0400a6d7d98e789099e5fbb5d9..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/Examples/narrow-band/main.cu b/src/Examples/narrow-band/main.cu deleted file mode 100644 index 8849008ff630db0400a6d7d98e789099e5fbb5d9..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/main.cu +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/Examples/narrow-band/main.h b/src/Examples/narrow-band/main.h deleted file mode 100644 index 51dbdac37cfc5ff76b5ad03b826bf3a4642b17b4..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/main.h +++ /dev/null @@ -1,88 +0,0 @@ -/*************************************************************************** - main.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - - -#include "MainBuildConfig.h" - //for HOST versions: -//#include "tnlNarrowBand.h" - //for DEVICE versions: -#include "tnlNarrowBand_CUDA.h" -#include "narrowBandConfig.h" -#include <solvers/tnlBuildConfigTags.h> - -#include <mesh/tnlGrid.h> -#include <core/tnlDevice.h> -#include <time.h> -#include <ctime> - -typedef MainBuildConfig BuildConfig; - -int main( int argc, char* argv[] ) -{ - time_t start; - time_t stop; - time(&start); - std::clock_t start2= std::clock(); - Config::ParameterContainer parameters; - tnlConfigDescription configDescription; - narrowBandConfig< BuildConfig >::configSetup( configDescription ); - - if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) - return false; - - const int& dim = parameters.getParameter< int >( "dim" ); - - if(dim == 2) - { - tnlNarrowBand<tnlGrid<2,double,TNL::Devices::Host, int>, double, int> solver; - if(!solver.init(parameters)) - { - cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - TNL_CHECK_CUDA_DEVICE; - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver..." <<std::endl; - solver.run(); - } -// else if(dim == 3) -// { -// tnlNarrowBand<tnlGrid<3,double,TNL::Devices::Host, int>, double, int> solver; -// if(!solver.init(parameters)) -// { -// cerr << "Solver failed to initialize." <<std::endl; -// return EXIT_FAILURE; -// } -// TNL_CHECK_CUDA_DEVICE; -// std::cout << "-------------------------------------------------------------" <<std::endl; -// std::cout << "Starting solver..." <<std::endl; -// solver.run(); -// } - else - { - std::cerr << "Unsupported number of dimensions: " << dim << "!" <<std::endl; - return EXIT_FAILURE; - } - - - time(&stop); - std::cout << "Solver stopped..." <<std::endl; - std::cout <<std::endl; - std::cout << "Running time was: " << difftime(stop,start) << " .... " << (std::clock() - start2) / (double)(CLOCKS_PER_SEC) <<std::endl; - return EXIT_SUCCESS; -} - - diff --git a/src/Examples/narrow-band/narrowBandConfig.h b/src/Examples/narrow-band/narrowBandConfig.h deleted file mode 100644 index bab58ceac46bf9c766b697ed79c2c676111323a2..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/narrowBandConfig.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - narrowBandConfig.h - description - ------------------- - begin : Oct 15, 2015 - copyright : (C) 2015 by Tomas Sobotik - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef NARROWBANDCONFIG_H_ -#define NARROWBANDCONFIG_H_ - -#include <config/tnlConfigDescription.h> - -template< typename ConfigTag > -class narrowBandConfig -{ - public: - static void configSetup( tnlConfigDescription& config ) - { - config.addDelimiter( "Narrow Band Solver solver settings:" ); - config.addEntry < String > ( "problem-name", "This defines particular problem.", "fast-sweeping" ); - config.addRequiredEntry < String > ( "initial-condition", "Initial condition for solver"); - config.addRequiredEntry < int > ( "dim", "Dimension of problem."); - config.addRequiredEntry < double > ( "tau", "Time step."); - config.addRequiredEntry < double > ( "final-time", "Final time."); - config.addEntry < String > ( "mesh", "Name of mesh.", "mesh.tnl" ); - config.addEntry < String > ( "exact-input", "Are the function values near the curve equal to the SDF? (yes/no)", "no" ); - } -}; - -#endif /* NARROWBANDCONFIG_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand.h b/src/Examples/narrow-band/tnlNarrowBand.h deleted file mode 100644 index 7d3d19bc03b43247f735cf04c5c82368360a748d..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand.h +++ /dev/null @@ -1,186 +0,0 @@ -/*************************************************************************** - tnlNarrowBand.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND_H_ -#define TNLNARROWBAND_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <functions/tnlMeshFunction.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> -#include <limits.h> -#include <core/tnlDevice.h> -#include <ctime> -#ifdef HAVE_OPENMP -#include <omp.h> -#endif - - - - -template< typename Mesh, - typename Real, - typename Index > -class tnlNarrowBand -{}; - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 2, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - - tnlNarrowBand(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - - bool initGrid(); - bool run(); - - //for single core version use this implementation: - void updateValue(const Index i, const Index j); - //for parallel version use this one instead: -// void updateValue(const Index i, const Index j, DofVectorType* grid); - - - void setupSquare1000(Index i, Index j); - void setupSquare1100(Index i, Index j); - void setupSquare1010(Index i, Index j); - void setupSquare1001(Index i, Index j); - void setupSquare1110(Index i, Index j); - void setupSquare1101(Index i, Index j); - void setupSquare1011(Index i, Index j); - void setupSquare1111(Index i, Index j); - void setupSquare0000(Index i, Index j); - void setupSquare0100(Index i, Index j); - void setupSquare0010(Index i, Index j); - void setupSquare0001(Index i, Index j); - void setupSquare0110(Index i, Index j); - void setupSquare0101(Index i, Index j); - void setupSquare0011(Index i, Index j); - void setupSquare0111(Index i, Index j); - - Real fabsMin(const Real x, const Real y); - - -protected: - - MeshType Mesh; - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector, dofVector2; - DofVectorType data; - - RealType h; - - tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage > Entity; - - -#ifdef HAVE_OPENMP -// omp_lock_t* gridLock; -#endif - - -}; - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 3, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - tnlNarrowBand(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - - bool initGrid(); - bool run(); - - //for single core version use this implementation: - void updateValue(const Index i, const Index j, const Index k); - //for parallel version use this one instead: -// void updateValue(const Index i, const Index j, DofVectorType* grid); - - Real fabsMin(const Real x, const Real y); - - -protected: - - MeshType Mesh; - - bool exactInput; - - - tnlMeshFunction<MeshType> dofVector, dofVector2; - DofVectorType data; - - RealType h; - - tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage > Entity; - -#ifdef HAVE_OPENMP -// omp_lock_t* gridLock; -#endif - - -}; - - - //for single core version use this implementation: -#include "tnlNarrowBand2D_impl.h" - //for parallel version use this one instead: -// #include "tnlNarrowBand2D_openMP_impl.h" - -#include "tnlNarrowBand3D_impl.h" - -#endif /* TNLNARROWBAND_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand2D_CUDA_v4_impl.h b/src/Examples/narrow-band/tnlNarrowBand2D_CUDA_v4_impl.h deleted file mode 100644 index dff0b48c8d69cc6fa6ec932e24446a8c3b1b1417..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand2D_CUDA_v4_impl.h +++ /dev/null @@ -1,1317 +0,0 @@ -/*************************************************************************** - tnlNarrowBand2D_CUDA_v4_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND2D_IMPL_H_ -#define TNLNARROWBAND2D_IMPL_H_ - -#define NARROWBAND_SUBGRID_SIZE 32 - -#include "tnlNarrowBand.h" - -#ifdef HAVE_CUDA -__device__ -double fabsMin( double x, double y) -{ - double fx = abs(x); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; -} - -__device__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(__longlong_as_double(assumed),val) )); - } while (assumed != old); - return __longlong_as_double(old); -} -#endif - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -#ifdef HAVE_CUDA - __device__ __host__ -#endif -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >:: positivePart(const Real arg) const -{ - if(arg > 0.0) - return arg; - return 0.0; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -#ifdef HAVE_CUDA - __device__ __host__ -#endif -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: negativePart(const Real arg) const -{ - if(arg < 0.0) - return -arg; - return 0.0; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlNarrowBand< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlNarrowBand() -:dofVector(Mesh) -{ -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - //Entity.refresh(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - tau = parameters.getParameter< double >( "tau" ); - - finalTime = parameters.getParameter< double >( "final-time" ); - - statusGridSize = ((Mesh.getDimensions().x() + NARROWBAND_SUBGRID_SIZE-1 ) / NARROWBAND_SUBGRID_SIZE); -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaStatusVector), statusGridSize*statusGridSize*sizeof(int)); -// cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), statusGridSize*statusGridSize* sizeof(int)), cudaMemcpyHostToDevice); - - cudaMalloc(&reinitialize, sizeof(int)); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; -#endif - - int n = Mesh.getDimensions().x(); - - dim3 threadsPerBlock2(NARROWBAND_SUBGRID_SIZE, NARROWBAND_SUBGRID_SIZE); - dim3 numBlocks2(statusGridSize ,statusGridSize); - initSetupGridCUDA<<<numBlocks2,threadsPerBlock2>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initSetupGrid2CUDA<<<numBlocks2,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - - /*dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1);*/ - initCUDA<<<numBlocks2,threadsPerBlock2>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - - cout << "Solver initialized." <<std::endl; - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlockFS(1, 512); - dim3 numBlocksFS(4,1); - dim3 threadsPerBlockNB(NARROWBAND_SUBGRID_SIZE, NARROWBAND_SUBGRID_SIZE); - dim3 numBlocksNB(n/NARROWBAND_SUBGRID_SIZE + 1,n/NARROWBAND_SUBGRID_SIZE + 1); - - double time = 0.0; - int reinit = 0; - - cout << "Hi!" <<std::endl; - runCUDA<<<numBlocksFS,threadsPerBlockFS>>>(this->cudaSolver,0,0); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - cout << "Hi2!" <<std::endl; - while(time < finalTime) - { - if(tau+time > finalTime) - tau=finalTime-time; - - runNarrowBandCUDA<<<numBlocksNB,threadsPerBlockNB>>>(this->cudaSolver,tau); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - time += tau; - - - cudaMemcpy(&reinit, this->reinitialize, sizeof(int), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - if(reinit != 0 /*&& time != finalTime */) - { - cout << time <<std::endl; - - initSetupGridCUDA<<<numBlocksNB,threadsPerBlockNB>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initSetupGrid2CUDA<<<numBlocksNB,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initCUDA<<<numBlocksNB,threadsPerBlockNB>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - runCUDA<<<numBlocksFS,threadsPerBlockFS>>>(this->cudaSolver,0,0); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - } - } - - //data.setLike(dofVector.getData()); - //cudaMemcpy(data.getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaMemcpy(dofVector.getData().getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - //data.save("u-00001.tnl"); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - // 1 - with curve, 2 - to the north of curve, 4 - to the south of curve, - // 8 - to the east of curve, 16 - to the west of curve. - int subgridID = i/NARROWBAND_SUBGRID_SIZE + (j/NARROWBAND_SUBGRID_SIZE) * statusGridSize; - if(cudaStatusVector[subgridID] != 0 && i<Mesh.getDimensions().x() && j < Mesh.getDimensions().y()) - { - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real value = cudaDofVector2[Entity.getIndex()]; - Real a,b, tmp; - - if( i == 0 /*|| (i/NARROWBAND_SUBGRID_SIZE == 0 && !(cudaStatusVector[subgridID] & 9))*/ ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 /*|| (i/NARROWBAND_SUBGRID_SIZE == NARROWBAND_SUBGRID_SIZE - 1 && !(cudaStatusVector[subgridID] & 17))*/ ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0 /*|| (j/NARROWBAND_SUBGRID_SIZE == 0 && !(cudaStatusVector[subgridID] & 3))*/ ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 /* || (j/NARROWBAND_SUBGRID_SIZE == NARROWBAND_SUBGRID_SIZE - 1 && !(cudaStatusVector[subgridID] & 5)) */) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - // cudaDofVector2[Entity.getIndex()] = fabsMin(value, tmp); - atomicFabsMin(&(cudaDofVector2[Entity.getIndex()]), tmp); - } - -} - - -__global__ void initCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - - - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int i = threadIdx.x + blockDim.x*blockIdx.x; - int j = blockDim.y*blockIdx.y + threadIdx.y; - - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - int gid = Entity.getIndex(); - - if(abs(cudaDofVector2[gid]) > 1.5*h) - cudaDofVector2[gid] = INT_MAX*sign(cudaDofVector2[gid]); - -// if (i >0 && j > 0 && i+1 < Mesh.getDimensions().x() && j+1 < Mesh.getDimensions().y()) -// { -// if(cudaDofVector2[gid]*cudaDofVector2[gid+1] <= 0 ) -// { -// cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; -// cudaDofVector2[gid+1] = sign(cudaDofVector2[gid+1])*0.5*h; -// } -// if( cudaDofVector2[gid]*cudaDofVector2[gid+Mesh.getDimensions().x()] <= 0 ) -// { -// cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; -// cudaDofVector2[gid+Mesh.getDimensions().x()] = sign(cudaDofVector2[gid+Mesh.getDimensions().x()])*0.5*h; -// } -// -// if(cudaDofVector2[gid]*cudaDofVector2[gid-1] <= 0 ) -// { -// cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; -// cudaDofVector2[gid-1] = sign(cudaDofVector2[gid-1])*0.5*h; -// } -// if( cudaDofVector2[gid]*cudaDofVector2[gid-Mesh.getDimensions().x()] <= 0 ) -// { -// cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; -// cudaDofVector2[gid-Mesh.getDimensions().x()] = sign(cudaDofVector2[gid-Mesh.getDimensions().x()])*0.5*h; -// } -// } - - -// - - - - - - -// if(i+1 < Mesh.getDimensions().x() && j+1 < Mesh.getDimensions().y() ) -// { -// if(cudaDofVector[Entity.getIndex()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1111(i,j); -// else -// setupSquare1110(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1101(i,j); -// else -// setupSquare1100(i,j); -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1011(i,j); -// else -// setupSquare1010(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1001(i,j); -// else -// setupSquare1000(i,j); -// } -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0111(i,j); -// else -// setupSquare0110(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0101(i,j); -// else -// setupSquare0100(i,j); -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0011(i,j); -// else -// setupSquare0010(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0001(i,j); -// else -// setupSquare0000(i,j); -// } -// } -// } -// -// } - - return true; - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - //Real fy = abs(y); - - //Real tmpMin = Min(fx,abs(y)); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - - int gx = 0; - int gy = threadIdx.y; - //if(solver->Mesh.getDimensions().x() <= gx || solver->Mesh.getDimensions().y() <= gy) - // return; - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - //int gid = solver->Mesh.getDimensions().x() * gy + gx; - //int max = solver->Mesh.getDimensions().x()*solver->Mesh.getDimensions().x(); - - //int id1 = gx+gy; - //int id2 = (solver->Mesh.getDimensions().x() - gx - 1) + gy; - - if(blockIdx.x==0) - { - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==1) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==2) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==3) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - -} - - - - -__global__ void initSetupGridCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - __shared__ double u0; - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - -// printf("Hello from block = %d, thread = %d, x = %d, y = %d\n", blockIdx.x + gridDim.x*blockIdx.y,(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x, threadIdx.x, threadIdx.y); - if(threadIdx.x+threadIdx.y == 0) - { -// printf("Hello from block = %d, thread = %d, x = %d, y = %d\n", blockIdx.x + gridDim.x*blockIdx.y,(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x, threadIdx.x, threadIdx.y); - - if(blockIdx.x+blockIdx.y == 0) - *(solver->reinitialize) = 0; - - solver->cudaStatusVector[blockIdx.x + gridDim.x*blockIdx.y] = 0; - - u0 = solver->cudaDofVector2[(blockDim.y*blockIdx.y + 0)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + 0]; - } - __syncthreads(); - - double u = solver->cudaDofVector2[(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x]; - - if(u*u0 <=0.0) - atomicMax(&(solver->cudaStatusVector[blockIdx.x + gridDim.x*blockIdx.y]),1); - } -// if(threadIdx.x+threadIdx.y == 0) - -// printf("Bye from block = %d, thread = %d, x = %d, y = %d\n", blockIdx.x + gridDim.x*blockIdx.y,(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x, threadIdx.x, threadIdx.y); - - -} - - - -// run this with one thread per block -__global__ void initSetupGrid2CUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ -// printf("Hello\n"); - if(solver->cudaStatusVector[blockIdx.x + gridDim.x*blockIdx.y] == 1) - { -// 1 - with curve, 2 - to the north of curve, 4 - to the south of curve, -// 8 - to the east of curve, 16 - to the west of curve. - if(blockIdx.x > 0) - { - atomicAdd(&(solver->cudaStatusVector[blockIdx.x - 1 + gridDim.x*blockIdx.y]), 16); - } - - if(blockIdx.x < gridDim.x - 1) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x + 1 + gridDim.x*blockIdx.y]), 8); - - if(blockIdx.y > 0 ) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x + gridDim.x*(blockIdx.y - 1)]), 4); - - if(blockIdx.y < gridDim.y - 1) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x + gridDim.x*(blockIdx.y + 1)]), 2); - } - - -} - - - - - -__global__ void runNarrowBandCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, double tau) -{ - int gid = (blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x()+ threadIdx.x; - int i = threadIdx.x + blockIdx.x*blockDim.x; - int j = threadIdx.y + blockIdx.y*blockDim.y; - -// if(i+j == 0) -// printf("Hello\n"); - - int blockID = blockIdx.x + blockIdx.y*gridDim.x; /*i/NARROWBAND_SUBGRID_SIZE + (j/NARROWBAND_SUBGRID_SIZE) * ((Mesh.getDimensions().x() + NARROWBAND_SUBGRID_SIZE-1 ) / NARROWBAND_SUBGRID_SIZE);*/ - - int status = solver->cudaStatusVector[blockID]; - - if(solver->Mesh.getDimensions().x() > i && solver->Mesh.getDimensions().y() > j) - { - - if(status != 0) - { - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(solver->Mesh); - Entity.setCoordinates(Containers::StaticVector<2,double>(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - double value = solver->cudaDofVector2[Entity.getIndex()]; - double xf,xb,yf,yb, grad, fu, a,b; - a = b = 0.0; - - if( i == 0 || (threadIdx.x == 0 && !(status & 9)) ) - { - xb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - xf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] - value; - } - else if( i == solver->Mesh.getDimensions().x() - 1 || (threadIdx.x == blockDim.x - 1 && !(status & 17)) ) - { - xb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - xf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()] - value; - } - else - { - xb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - xf = solver-> cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] - value; - } - - if( j == 0 || (threadIdx.y == 0 && !(status & 3)) ) - { - yb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ; - yf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] - value; - } - else if( j == solver->Mesh.getDimensions().y() - 1 || (threadIdx.y == blockDim.y - 1 && !(status & 5)) ) - { - yb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - yf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()] - value; - } - else - { - yb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - yf = solver-> cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] - value; - } - __syncthreads(); - - - - - - if(sign(value) >= 0.0) - { - xf = solver->negativePart(xf); - - xb = solver->positivePart(xb); - - yf = solver->negativePart(yf); - - yb = solver->positivePart(yb); - - } - else - { - - xb = solver->negativePart(xb); - - xf = solver->positivePart(xf); - - yb = solver->negativePart(yb); - - yf = solver->positivePart(yf); - } - - - if(xb > xf) - a = xb*solver->Mesh.template getSpaceStepsProducts< -1, 0 >(); - else - a = xf*solver->Mesh.template getSpaceStepsProducts< -1, 0 >(); - - if(yb > yf) - b = yb*solver->Mesh.template getSpaceStepsProducts< 0, -1 >(); - else - b = yf*solver->Mesh.template getSpaceStepsProducts< 0, -1 >(); - - - -// grad = sqrt(0.5 * (xf*xf + xb*xb + yf*yf + yb*yb ) )*solver->Mesh.template getSpaceStepsProducts< -1, 0 >(); - - grad = sqrt(/*0.5 **/ (a*a + b*b ) ); - - fu = -1.0 * grad; - - if((tau*fu+value)*value <=0 ) - { - // 1 - with curve, 2 - to the north of curve, 4 - to the south of curve, - // 8 - to the east of curve, 16 - to the west of curve. - - if((threadIdx.x == 6 && !(status & 9)) && (blockIdx.x > 0) ) - atomicMax(solver->reinitialize,1); - else if((threadIdx.x == blockDim.x - 7 && !(status & 17)) && (blockIdx.x < gridDim.x - 1) ) - atomicMax(solver->reinitialize,1); - else if((threadIdx.y == 6 && !(status & 3)) && (blockIdx.y > 0) ) - atomicMax(solver->reinitialize,1); - else if((threadIdx.y == blockDim.y - 7 && !(status & 5)) && (blockIdx.y < gridDim.y - 1) ) - atomicMax(solver->reinitialize,1); - } - - solver->cudaDofVector2[Entity.getIndex()] += tau*fu; - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(INT_MAX,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} -#endif - - - - -#endif /* TNLNARROWBAND_IMPL_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand2D_CUDA_v5_impl.h b/src/Examples/narrow-band/tnlNarrowBand2D_CUDA_v5_impl.h deleted file mode 100644 index c92810490069164d9f170249c328304576773d20..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand2D_CUDA_v5_impl.h +++ /dev/null @@ -1,1313 +0,0 @@ -/*************************************************************************** - tnlNarrowBand2D_CUDA_v4_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND2D_IMPL_H_ -#define TNLNARROWBAND2D_IMPL_H_ - -#define NARROWBAND_SUBGRID_SIZE 32 - -#include "tnlNarrowBand.h" - -__device__ -double fabsMin( double x, double y) -{ - double fx = abs(x); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; -} - -__device__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(__longlong_as_double(assumed),val) )); - } while (assumed != old); - return __longlong_as_double(old); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -#ifdef HAVE_CUDA - __device__ __host__ -#endif -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >:: positivePart(const Real arg) const -{ - if(arg > 0.0) - return arg; - return 0.0; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -#ifdef HAVE_CUDA - __device__ __host__ -#endif -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: negativePart(const Real arg) const -{ - if(arg < 0.0) - return -arg; - return 0.0; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlNarrowBand< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlNarrowBand() -:dofVector(Mesh) -{ -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - //Entity.refresh(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - tau = parameters.getParameter< double >( "tau" ); - - finalTime = parameters.getParameter< double >( "final-time" ); - - statusGridSize = ((Mesh.getDimensions().x() + NARROWBAND_SUBGRID_SIZE-1 ) / NARROWBAND_SUBGRID_SIZE); -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaStatusVector), statusGridSize*statusGridSize*sizeof(int)); -// cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), statusGridSize*statusGridSize* sizeof(int)), cudaMemcpyHostToDevice); - - cudaMalloc(&reinitialize, sizeof(int)); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; -#endif - - int n = Mesh.getDimensions().x(); - - dim3 threadsPerBlock2(NARROWBAND_SUBGRID_SIZE, NARROWBAND_SUBGRID_SIZE); - dim3 numBlocks2(statusGridSize ,statusGridSize); - initSetupGridCUDA<<<numBlocks2,threadsPerBlock2>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initSetupGrid2CUDA<<<numBlocks2,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - - /*dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1);*/ - initCUDA<<<numBlocks2,threadsPerBlock2>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - - cout << "Solver initialized." <<std::endl; - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlockFS(1, 512); - dim3 numBlocksFS(4,1); - dim3 threadsPerBlockNB(NARROWBAND_SUBGRID_SIZE, NARROWBAND_SUBGRID_SIZE); - dim3 numBlocksNB(n/NARROWBAND_SUBGRID_SIZE + 1,n/NARROWBAND_SUBGRID_SIZE + 1); - - double time = 0.0; - int reinit = 0; - - cout << "Hi!" <<std::endl; - runCUDA<<<numBlocksFS,threadsPerBlockFS>>>(this->cudaSolver,0,0); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - cout << "Hi2!" <<std::endl; - while(time < finalTime) - { - if(tau+time > finalTime) - tau=finalTime-time; - - runNarrowBandCUDA<<<numBlocksNB,threadsPerBlockNB>>>(this->cudaSolver,tau); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - time += tau; - - - cudaMemcpy(&reinit, this->reinitialize, sizeof(int), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - if(reinit != 0 /*&& time != finalTime */) - { - cout << time <<std::endl; - - initSetupGridCUDA<<<numBlocksNB,threadsPerBlockNB>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initSetupGrid2CUDA<<<numBlocksNB,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initCUDA<<<numBlocksNB,threadsPerBlockNB>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - runCUDA<<<numBlocksFS,threadsPerBlockFS>>>(this->cudaSolver,0,0); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - } - } - - //data.setLike(dofVector.getData()); - //cudaMemcpy(data.getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaMemcpy(dofVector.getData().getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - //data.save("u-00001.tnl"); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - // 1 - with curve, 2 - to the north of curve, 4 - to the south of curve, - // 8 - to the east of curve, 16 - to the west of curve. - int subgridID = i/NARROWBAND_SUBGRID_SIZE + (j/NARROWBAND_SUBGRID_SIZE) * ((Mesh.getDimensions().x() + NARROWBAND_SUBGRID_SIZE-1 ) / NARROWBAND_SUBGRID_SIZE); - if(/*cudaStatusVector[subgridID] != 0 &&*/ i<Mesh.getDimensions().x() && Mesh.getDimensions().y()) - { - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real value = cudaDofVector2[Entity.getIndex()]; - Real a,b, tmp; - - if( i == 0 /*|| (i/NARROWBAND_SUBGRID_SIZE == 0 && !(cudaStatusVector[subgridID] & 9)) */) - a = cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 /*|| (i/NARROWBAND_SUBGRID_SIZE == NARROWBAND_SUBGRID_SIZE - 1 && !(cudaStatusVector[subgridID] & 17)) */) - a = cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0/* || (j/NARROWBAND_SUBGRID_SIZE == 0 && !(cudaStatusVector[subgridID] & 3)) */) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 /* || (j/NARROWBAND_SUBGRID_SIZE == NARROWBAND_SUBGRID_SIZE - 1 && !(cudaStatusVector[subgridID] & 5))*/ ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - // cudaDofVector2[Entity.getIndex()] = fabsMin(value, tmp); - atomicFabsMin(&(cudaDofVector2[Entity.getIndex()]), tmp); - } - -} - - -__global__ void initCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - - - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int i = threadIdx.x + blockDim.x*blockIdx.x; - int j = blockDim.y*blockIdx.y + threadIdx.y; - - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - int gid = Entity.getIndex(); - - cudaDofVector2[gid] = INT_MAX*sign(cudaDofVector2[gid]); - - if (i >0 && j > 0 && i+1 < Mesh.getDimensions().x() && j+1 < Mesh.getDimensions().y()) - { - if(cudaDofVector2[gid]*cudaDofVector2[gid+1] <= 0 ) - { - cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; - cudaDofVector2[gid+1] = sign(cudaDofVector2[gid+1])*0.5*h; - } - if( cudaDofVector2[gid]*cudaDofVector2[gid+Mesh.getDimensions().x()] <= 0 ) - { - cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; - cudaDofVector2[gid+Mesh.getDimensions().x()] = sign(cudaDofVector2[gid+Mesh.getDimensions().x()])*0.5*h; - } - - if(cudaDofVector2[gid]*cudaDofVector2[gid-1] <= 0 ) - { - cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; - cudaDofVector2[gid-1] = sign(cudaDofVector2[gid-1])*0.5*h; - } - if( cudaDofVector2[gid]*cudaDofVector2[gid-Mesh.getDimensions().x()] <= 0 ) - { - cudaDofVector2[gid] = sign(cudaDofVector2[gid])*0.5*h; - cudaDofVector2[gid-Mesh.getDimensions().x()] = sign(cudaDofVector2[gid-Mesh.getDimensions().x()])*0.5*h; - } - } - - -// - - - - - - -// if(i+1 < Mesh.getDimensions().x() && j+1 < Mesh.getDimensions().y() ) -// { -// if(cudaDofVector[Entity.getIndex()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1111(i,j); -// else -// setupSquare1110(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1101(i,j); -// else -// setupSquare1100(i,j); -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1011(i,j); -// else -// setupSquare1010(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1001(i,j); -// else -// setupSquare1000(i,j); -// } -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0111(i,j); -// else -// setupSquare0110(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0101(i,j); -// else -// setupSquare0100(i,j); -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0011(i,j); -// else -// setupSquare0010(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0001(i,j); -// else -// setupSquare0000(i,j); -// } -// } -// } -// -// } - - return true; - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - //Real fy = abs(y); - - //Real tmpMin = Min(fx,abs(y)); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - - int gx = 0; - int gy = threadIdx.y; - //if(solver->Mesh.getDimensions().x() <= gx || solver->Mesh.getDimensions().y() <= gy) - // return; - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - //int gid = solver->Mesh.getDimensions().x() * gy + gx; - //int max = solver->Mesh.getDimensions().x()*solver->Mesh.getDimensions().x(); - - //int id1 = gx+gy; - //int id2 = (solver->Mesh.getDimensions().x() - gx - 1) + gy; - - if(blockIdx.x==0) - { - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==1) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==2) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==3) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - -} - - - - -__global__ void initSetupGridCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - __shared__ double u0; - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - -// printf("Hello from block = %d, thread = %d, x = %d, y = %d\n", blockIdx.x + gridDim.x*blockIdx.y,(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x, threadIdx.x, threadIdx.y); - if(threadIdx.x+threadIdx.y == 0) - { -// printf("Hello from block = %d, thread = %d, x = %d, y = %d\n", blockIdx.x + gridDim.x*blockIdx.y,(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x, threadIdx.x, threadIdx.y); - - if(blockIdx.x+blockIdx.y == 0) - *(solver->reinitialize) = 0; - - solver->cudaStatusVector[blockIdx.x + gridDim.x*blockIdx.y] = 0; - - u0 = solver->cudaDofVector2[(blockDim.y*blockIdx.y + 0)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + 0]; - } - __syncthreads(); - - double u = solver->cudaDofVector2[(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x]; - - if(u*u0 <=0.0) - atomicMax(&(solver->cudaStatusVector[blockIdx.x + gridDim.x*blockIdx.y]),1); - } -// if(threadIdx.x+threadIdx.y == 0) - -// printf("Bye from block = %d, thread = %d, x = %d, y = %d\n", blockIdx.x + gridDim.x*blockIdx.y,(blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x() + blockDim.x*blockIdx.x + threadIdx.x, threadIdx.x, threadIdx.y); - - -} - - - -// run this with one thread per block -__global__ void initSetupGrid2CUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ -// printf("Hello\n"); - if(solver->cudaStatusVector[blockIdx.x + gridDim.x*blockIdx.y] == 1) - { -// 1 - with curve, 2 - to the north of curve, 4 - to the south of curve, -// 8 - to the east of curve, 16 - to the west of curve. - if(blockIdx.x > 0) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x - 1 + gridDim.x*blockIdx.y]), 16); - - if(blockIdx.x < gridDim.x - 1) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x + 1 + gridDim.x*blockIdx.y]), 8); - - if(blockIdx.y > 0 ) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x + gridDim.x*(blockIdx.y - 1)]), 4); - - if(blockIdx.y < gridDim.y - 1) - atomicAdd(&(solver->cudaStatusVector[blockIdx.x + gridDim.x*(blockIdx.y + 1)]), 2); - } - - -} - - - - - -__global__ void runNarrowBandCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, double tau) -{ - int gid = (blockDim.y*blockIdx.y + threadIdx.y)*solver->Mesh.getDimensions().x()+ threadIdx.x; - int i = threadIdx.x + blockIdx.x*blockDim.x; - int j = threadIdx.y + blockIdx.y*blockDim.y; - -// if(i+j == 0) -// printf("Hello\n"); - - int blockID = blockIdx.x + blockIdx.y*gridDim.x; /*i/NARROWBAND_SUBGRID_SIZE + (j/NARROWBAND_SUBGRID_SIZE) * ((Mesh.getDimensions().x() + NARROWBAND_SUBGRID_SIZE-1 ) / NARROWBAND_SUBGRID_SIZE);*/ - - int status = solver->cudaStatusVector[blockID]; - - if(solver->Mesh.getDimensions().x() > i && solver->Mesh.getDimensions().y() > j) - { - -// if(status != 0) - { - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(solver->Mesh); - Entity.setCoordinates(Containers::StaticVector<2,double>(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - double value = solver->cudaDofVector2[Entity.getIndex()]; - double xf,xb,yf,yb, grad, fu, a,b; - a = b = 0.0; - - if( i == 0 /*|| (threadIdx.x == 0 && !(status & 9)) */) - { - xb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - xf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] - value; - } - else if( i == solver->Mesh.getDimensions().x() - 1 /*|| (threadIdx.x == blockDim.x - 1 && !(status & 17)) */) - { - xb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - xf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()] - value; - } - else - { - xb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - xf = solver-> cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] - value; - } - - if( j == 0/* || (threadIdx.y == 0 && !(status & 3))*/ ) - { - yb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ; - yf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] - value; - } - else if( j == solver->Mesh.getDimensions().y() - 1 /*|| (threadIdx.y == blockDim.y - 1 && !(status & 5)) */) - { - yb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - yf = solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()] - value; - } - else - { - yb = value - solver->cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - yf = solver-> cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] - value; - } - __syncthreads(); - - - - - - if(sign(value) > 0.0) - { - xf = solver->negativePart(xf); - - xb = solver->positivePart(xb); - - yf = solver->negativePart(yf); - - yb = solver->positivePart(yb); - - } - else - { - - xb = solver->negativePart(xb); - - xf = solver->positivePart(xf); - - yb = solver->negativePart(yb); - - yf = solver->positivePart(yf); - } - - - if(xb > xf) - a = xb*solver->Mesh.template getSpaceStepsProducts< -1, 0 >(); - else - a = xf*solver->Mesh.template getSpaceStepsProducts< -1, 0 >(); - - if(yb > yf) - b = yb*solver->Mesh.template getSpaceStepsProducts< 0, -1 >(); - else - b = yf*solver->Mesh.template getSpaceStepsProducts< 0, -1 >(); - - - -// grad = sqrt(0.5 * (xf*xf + xb*xb + yf*yf + yb*yb ) )*solver->Mesh.template getSpaceStepsProducts< -1, 0 >(); - - grad = sqrt(/*0.5 **/ (a*a + b*b ) ); - - fu = -1.0 * grad; - -// if((tau*fu+value)*value <=0 ) -// { -// // 1 - with curve, 2 - to the north of curve, 4 - to the south of curve, -// // 8 - to the east of curve, 16 - to the west of curve. -// -// if((threadIdx.x == 1 && !(status & 9)) && (blockIdx.x > 0) ) -// atomicMax(solver->reinitialize,1); -// else if((threadIdx.x == blockDim.x - 2 && !(status & 17)) && (blockIdx.x < gridDim.x - 1) ) -// atomicMax(solver->reinitialize,1); -// else if((threadIdx.y == 1 && !(status & 3)) && (blockIdx.y > 0) ) -// atomicMax(solver->reinitialize,1); -// else if((threadIdx.y == blockDim.y - 2 && !(status & 5)) && (blockIdx.y < gridDim.y - 1) ) -// atomicMax(solver->reinitialize,1); -// } - - solver->cudaDofVector2[Entity.getIndex()] += tau*fu; - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(INT_MAX,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} -#endif - - - - -#endif /* TNLNARROWBAND_IMPL_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand2D_impl.h b/src/Examples/narrow-band/tnlNarrowBand2D_impl.h deleted file mode 100644 index d42bc2a7610d5bb02a94031d446a61ac5a2e6579..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand2D_impl.h +++ /dev/null @@ -1,927 +0,0 @@ -/*************************************************************************** - tnlNarrowBand2D_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND2D_IMPL_H_ -#define TNLNARROWBAND2D_IMPL_H_ - -#include "tnlNarrowBand.h" - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlNarrowBand< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlNarrowBand() -:Entity(Mesh), - dofVector(Mesh), - dofVector2(Mesh) -{ -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - dofVector2.load(initialCondition); - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - Entity.refresh(); - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - cout << "a" <<std::endl; - return initGrid(); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - for(int i=0; i< Mesh.getDimensions().x()*Mesh.getDimensions().x();i++) - { - dofVector2[i]=INT_MAX*sign(dofVector[i]); - } - - for(int i = 0 ; i < Mesh.getDimensions().x()-1; i++) - { - for(int j = 0 ; j < Mesh.getDimensions().x()-1; j++) - { - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - neighborEntities.refresh(Mesh,Entity.getIndex()); - - if(dofVector[this->Entity.getIndex()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1111(i,j); - else - setupSquare1110(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1101(i,j); - else - setupSquare1100(i,j); - } - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1011(i,j); - else - setupSquare1010(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1001(i,j); - else - setupSquare1000(i,j); - } - } - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0111(i,j); - else - setupSquare0110(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0101(i,j); - else - setupSquare0100(i,j); - } - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0011(i,j); - else - setupSquare0010(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0001(i,j); - else - setupSquare0000(i,j); - } - } - } - - } - } - cout << "a" <<std::endl; - -// Real tmp = 0.0; -// Real ax=0.5/sqrt(2.0); -// -// if(!exactInput) -// { -// for(Index i = 0; i < Mesh.getDimensions().x()*Mesh.getDimensions().y(); i++) -// dofVector[i]=0.5*h*sign(dofVector[i]); -// } -// -// -// for(Index i = 1; i < Mesh.getDimensions().x()-1; i++) -// { -// for(Index j = 1; j < Mesh.getDimensions().y()-1; j++) -// { -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// } -// -// -// -// for(int i = 1; i < Mesh.getDimensions().x()-1; i++) -// { -// Index j = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// for(int i = 1; i < Mesh.getDimensions().x()-1; i++) -// { -// Index j = Mesh.getDimensions().y() - 1; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// for(int j = 1; j < Mesh.getDimensions().y()-1; j++) -// { -// Index i = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// for(int j = 1; j < Mesh.getDimensions().y()-1; j++) -// { -// Index i = Mesh.getDimensions().x() - 1; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// -// Index i = Mesh.getDimensions().x() - 1; -// Index j = Mesh.getDimensions().y() - 1; -// -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// -// -// -// j = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// -// -// -// i = 0; -// j = Mesh.getDimensions().y() -1; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// -// -// -// j = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - - //data.setLike(dofVector2.getData()); - //data=dofVector2.getData(); - //cout << data.getType() <<std::endl; - dofVector2.save("u-00000.tnl"); - //dofVector2.getData().save("u-00000.tnl"); - - return true; -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - -// data.setLike(dofVector2.getData()); -// data = dofVector2.getData(); -// cout << data.getType() <<std::endl; - dofVector2.save("u-00001.tnl"); - //dofVector2.getData().save("u-00001.tnl"); - - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - Real value = dofVector2[Entity.getIndex()]; - Real a,b, tmp; - - if( i == 0 ) - a = dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = dofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( dofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(fabs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - - dofVector2[Entity.getIndex()] = fabsMin(value, tmp); - -// if(dofVector2[Entity.getIndex()] > 1.0) -// cout << value << " " << tmp << " " << dofVector2[Entity.getIndex()] <<std::endl; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -Real tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = fabs(x); - Real fy = fabs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// auto neighborEntities = Entity.getNeighborEntities(); -// dofVector2[Entity.getIndex()]=fabsMin(INT_MAX,dofVector2[Entity.getIndex()]); -// dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// auto neighborEntities = Entity.getNeighborEntities(); -// dofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,dofVector2[(Entity.getIndex())]); -// dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - dofVector2[Entity.getIndex()]=fabsMin(dofVector[Entity.getIndex()],dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - dofVector2[Entity.getIndex()]=fabsMin(dofVector[Entity.getIndex()],dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} - - - - -#endif /* TNLNARROWBAND_IMPL_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand3D_CUDA_impl.h b/src/Examples/narrow-band/tnlNarrowBand3D_CUDA_impl.h deleted file mode 100644 index d362f249a79112aa9b902f86cd1a304702292423..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand3D_CUDA_impl.h +++ /dev/null @@ -1,961 +0,0 @@ -/*************************************************************************** - tnlNarrowBand2D_CUDA_v4_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND3D_IMPL_H_ -#define TNLNARROWBAND3D_IMPL_H_ - -#include "tnlNarrowBand.h" - -//__device__ -//double fabsMin( double x, double y) -//{ -// double fx = abs(x); -// -// if(Min(fx,abs(y)) == fx) -// return x; -// else -// return y; -//} -// -//__device__ -//double atomicFabsMin(double* address, double val) -//{ -// unsigned long long int* address_as_ull = -// (unsigned long long int*)address; -// unsigned long long int old = *address_as_ull, assumed; -// do { -// assumed = old; -// old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(assumed,val) )); -// } while (assumed != old); -// return __longlong_as_double(old); -//} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlNarrowBand< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - this->h = Mesh.template getSpaceStepsProducts< 1, 0, 0 >(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(8, 8,8); - dim3 numBlocks(n/8 + 1, n/8 +1, n/8 +1); - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(1, 512); - dim3 numBlocks(8,1); - - - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,0,0); - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(this->dofVector.getData().getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, Index k) -{ - tnlGridEntity< tnlGrid< 3,double, TNL::Devices::Host, int >, 3, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j,k)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage >,3> neighborEntities(Entity); - Real value = cudaDofVector2[Entity.getIndex()]; - Real a,b,c, tmp; - - if( i == 0 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0, 0 >()]; - else - { - a = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0, 0 >()] ); - } - - if( j == 0 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1, 0 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1, 0 >()]; - else - { - b = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1, 0 >()] ); - } - - if( k == 0 ) - c = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, 1 >()]; - else if( k == Mesh.getDimensions().z() - 1 ) - c = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, -1 >()]; - else - { - c = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, -1 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, 1 >()] ); - } - - Real hD = 3.0*h*h - 2.0*(a*a + b*b + c*c - a*b - a*c - b*c); - - if(hD < 0.0) - tmp = fabsMin(a,fabsMin(b,c)) + sign(value)*h; - else - tmp = (1.0/3.0) * ( a + b + c + sign(value)*sqrt(hD) ); - - atomicFabsMin(&cudaDofVector2[Entity.getIndex()],tmp); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid(int i, int j, int k) -{ - tnlGridEntity< tnlGrid< 3,double, TNL::Devices::Host, int >, 3, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j,k)); - Entity.refresh(); - int gid = Entity.getIndex(); - - if(abs(cudaDofVector[gid]) < 1.8*h) - cudaDofVector2[gid] = cudaDofVector[gid]; - else - cudaDofVector2[gid] = INT_MAX*sign(cudaDofVector[gid]); - - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlNarrowBand< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - int gx = 0; - int gy = threadIdx.y; - - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - - if(blockIdx.x==0) - { - for(int gz = 0; gz < n;gz++) - { - gx = 0; - gy = threadIdx.y; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - __syncthreads(); - } - } - else if(blockIdx.x==1) - { - for(int gz = 0; gz < n;gz++) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==2) - { - - for(int gz = 0; gz < n;gz++) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==3) - { - for(int gz = 0; gz < n;gz++) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - - - - - else if(blockIdx.x==4) - { - for(int gz = n-1; gz > -1;gz--) - { - gx = 0; - gy = threadIdx.y; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==5) - { - for(int gz = n-1; gz > -1;gz--) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==6) - { - - for(int gz = n-1; gz > -1;gz--) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==7) - { - for(int gz = n-1; gz > -1;gz--) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - - - - -} - - -__global__ void initCUDA(tnlNarrowBand< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver) -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - int gz = blockDim.z*blockIdx.z + threadIdx.z; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy && solver->Mesh.getDimensions().z() > gz) - { - solver->initGrid(gx,gy,gz); - } - - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(INT_MAX,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(-INT_MAX,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -// -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = al-be; -// b=1.0; -// c=-al; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = al-be; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(cudaDofVector[index],cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -// -// -// -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = al-be; -// b=1.0; -// c=-al; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = al-be; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(cudaDofVector[index],cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -//} -#endif - - - - -#endif /* TNLNARROWBAND_IMPL_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand3D_impl.h b/src/Examples/narrow-band/tnlNarrowBand3D_impl.h deleted file mode 100644 index 6e63d527b92e0b5c7907a5a2e8b24cba7ed432f2..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand3D_impl.h +++ /dev/null @@ -1,307 +0,0 @@ -/*************************************************************************** - tnlNarrowBand2D_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND3D_IMPL_H_ -#define TNLNARROWBAND3D_IMPL_H_ - -#include "tnlNarrowBand.h" - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlNarrowBand< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: tnlNarrowBand() -:Entity(Mesh), - dofVector(Mesh), - dofVector2(Mesh) -{ -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - dofVector2.load(initialCondition); - - h = Mesh.template getSpaceStepsProducts< 1, 0, 0 >(); - Entity.refresh(); - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; -// cout << "bla "<<endl; - return initGrid(); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - for(int i=0; i< Mesh.getDimensions().x()*Mesh.getDimensions().y()*Mesh.getDimensions().z();i++) - { - - if (abs(dofVector[i]) < 1.8*h) - dofVector2[i]=dofVector[i]; - else - dofVector2[i]=INT_MAX*sign(dofVector[i]); - } - - return true; -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - - - - - - - - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - - dofVector2.save("u-00001.tnl"); - - cout << "bla 3"<<endl; - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, Index k) -{ - this->Entity.setCoordinates(CoordinatesType(i,j,k)); - this->Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage >,3> neighborEntities(Entity); - Real value = dofVector2[Entity.getIndex()]; - Real a,b,c, tmp; - - if( i == 0 ) - a = dofVector2[neighborEntities.template getEntityIndex< 1, 0, 0>()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = dofVector2[neighborEntities.template getEntityIndex< -1, 0, 0 >()]; - else - { - a = fabsMin( dofVector2[neighborEntities.template getEntityIndex< -1, 0, 0>()], - dofVector2[neighborEntities.template getEntityIndex< 1, 0, 0>()] ); - } - - if( j == 0 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, 1, 0>()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, -1, 0>()]; - else - { - b = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, -1, 0>()], - dofVector2[neighborEntities.template getEntityIndex< 0, 1, 0>()] ); - } - - if( k == 0 ) - c = dofVector2[neighborEntities.template getEntityIndex< 0, 0, 1>()]; - else if( k == Mesh.getDimensions().z() - 1 ) - c = dofVector2[neighborEntities.template getEntityIndex< 0, 0, -1>()]; - else - { - c = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, 0, -1>()], - dofVector2[neighborEntities.template getEntityIndex< 0, 0, 1>()] ); - } - - Real hD = 3.0*h*h - 2.0*(a*a+b*b+c*c-a*b-a*c-b*c); - - if(hD < 0.0) - tmp = fabsMin(a,fabsMin(b,c)) + sign(value)*h; - else - tmp = (1.0/3.0) * ( a + b + c + sign(value)*sqrt(hD) ); - - - dofVector2[Entity.getIndex()] = fabsMin(value, tmp); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -Real tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = fabs(x); - Real fy = fabs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - -} - - - -#endif /* TNLNARROWBAND_IMPL_H_ */ diff --git a/src/Examples/narrow-band/tnlNarrowBand_CUDA.h b/src/Examples/narrow-band/tnlNarrowBand_CUDA.h deleted file mode 100644 index ca9b1da2cc6e26b14bc003532b6eea75e89d907d..0000000000000000000000000000000000000000 --- a/src/Examples/narrow-band/tnlNarrowBand_CUDA.h +++ /dev/null @@ -1,203 +0,0 @@ -/*************************************************************************** - tnlNarrowBand_CUDA.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLNARROWBAND_H_ -#define TNLNARROWBAND_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> - -#include <functions/tnlMeshFunction.h> -#include <limits.h> -#include <core/tnlDevice.h> -#include <ctime> - - - - - -template< typename Mesh, - typename Real, - typename Index > -class tnlNarrowBand -{}; - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 2, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - tnlNarrowBand(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - bool run(); -#ifdef HAVE_CUDA - __device__ __host__ -#endif - RealType positivePart(const RealType arg) const; -#ifdef HAVE_CUDA - __device__ __host__ -#endif - RealType negativePart(const RealType arg) const; - -#ifdef HAVE_CUDA - __device__ bool initGrid(); - __device__ void updateValue(const Index i, const Index j); - __device__ void updateValue(const Index i, const Index j, double** sharedMem, const int k3); - __device__ Real fabsMin(const Real x, const Real y); - - tnlNarrowBand< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >* cudaSolver; - double* cudaDofVector; - double* cudaDofVector2; - int* cudaStatusVector; - int counter; - int* reinitialize; - __device__ void setupSquare1000(Index i, Index j); - __device__ void setupSquare1100(Index i, Index j); - __device__ void setupSquare1010(Index i, Index j); - __device__ void setupSquare1001(Index i, Index j); - __device__ void setupSquare1110(Index i, Index j); - __device__ void setupSquare1101(Index i, Index j); - __device__ void setupSquare1011(Index i, Index j); - __device__ void setupSquare1111(Index i, Index j); - __device__ void setupSquare0000(Index i, Index j); - __device__ void setupSquare0100(Index i, Index j); - __device__ void setupSquare0010(Index i, Index j); - __device__ void setupSquare0001(Index i, Index j); - __device__ void setupSquare0110(Index i, Index j); - __device__ void setupSquare0101(Index i, Index j); - __device__ void setupSquare0011(Index i, Index j); - __device__ void setupSquare0111(Index i, Index j); -#endif - - MeshType Mesh; - -protected: - - int statusGridSize; - bool exactInput; - - tnlMeshFunction<MeshType> dofVector; - DofVectorType data; - - - RealType h, tau, finalTime; - - -}; - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 3, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - bool run(); - -#ifdef HAVE_CUDA - __device__ bool initGrid(int i, int j, int k); - __device__ void updateValue(const Index i, const Index j, const Index k); - __device__ void updateValue(const Index i, const Index j, const Index k, double** sharedMem, const int k3); - __device__ Real fabsMin(const Real x, const Real y); - - tnlNarrowBand< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >* cudaSolver; - double* cudaDofVector; - double* cudaDofVector2; - int counter; -#endif - - MeshType Mesh; - -protected: - - - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector; - DofVectorType data; - - RealType h; - - -}; - - - - - - - -#ifdef HAVE_CUDA -//template<int sweep_t> -__global__ void runCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i); -//__global__ void runCUDA(tnlNarrowBand< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i); - -__global__ void initCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver); - -__global__ void initSetupGridCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver); -__global__ void initSetupGrid2CUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver); -__global__ void initSetupGrid1_2CUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver); -__global__ void runNarrowBandCUDA(tnlNarrowBand< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, double tau); -//__global__ void initCUDA(tnlNarrowBand< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver); -#endif - - - -#include "tnlNarrowBand2D_CUDA_v4_impl.h" -// #include "tnlNarrowBand3D_CUDA_impl.h" - -#endif /* TNLNARROWBAND_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/CMakeLists.txt b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/CMakeLists.txt deleted file mode 100644 index 3f9db0da04526a8d5fc935f4079cc0bca91b3e56..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -set( tnl_fast_sweeping_map_SOURCES -# MainBuildConfig.h -# tnlFastSweepingMap2D_impl.h -# tnlFastSweepingMap.h -# fastSweepingMapConfig.h - main.cpp) - - -IF( BUILD_CUDA ) - CUDA_ADD_EXECUTABLE(fast-sweeping-map main.cu) -ELSE( BUILD_CUDA ) - ADD_EXECUTABLE(fast-sweeping-map main.cpp) -ENDIF( BUILD_CUDA ) -target_link_libraries (fast-sweeping-map tnl ) - - -INSTALL( TARGETS fast-sweeping-map - RUNTIME DESTINATION bin - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) - -#INSTALL( FILES ${tnl_fast_sweeping_map_SOURCES} -# DESTINATION ${TNL_TARGET_DATA_DIRECTORY}/examples/fast-sweeping-map ) diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/MainBuildConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/MainBuildConfig.h deleted file mode 100644 index ed3d686eb99379af1589d734eac9b5812cccdedf..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/MainBuildConfig.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - MainBuildConfig.h - description - ------------------- - begin : Jul 7, 2014 - copyright : (C) 2014 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef MAINBUILDCONFIG_H_ -#define MAINBUILDCONFIG_H_ - -#include <solvers/tnlBuildConfigTags.h> - -class MainBuildConfig -{ - public: - - static void print() {std::cerr << "MainBuildConfig" <<std::endl; } -}; - -/**** - * Turn off support for float and long double. - */ -template<> struct tnlConfigTagReal< MainBuildConfig, float > { enum { enabled = false }; }; -template<> struct tnlConfigTagReal< MainBuildConfig, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct tnlConfigTagIndex< MainBuildConfig, short int >{ enum { enabled = false }; }; -template<> struct tnlConfigTagIndex< MainBuildConfig, long int >{ enum { enabled = false }; }; - -/**** - * Use of tnlGrid is enabled for allowed dimensions and Real, Device and Index types. - */ -template< int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< MainBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< MainBuildConfig, Dimensions >::enabled && - tnlConfigTagReal< MainBuildConfig, Real >::enabled && - tnlConfigTagDevice< MainBuildConfig, Device >::enabled && - tnlConfigTagIndex< MainBuildConfig, Index >::enabled }; }; - -/**** - * Please, chose your preferred time discretisation here. - */ -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = false}; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; - -/**** - * Only the Runge-Kutta-Merson solver is enabled by default. - */ -template<> struct tnlConfigTagExplicitSolver< MainBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; - -#endif /* MAINBUILDCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/fastSweepingMapConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/fastSweepingMapConfig.h deleted file mode 100644 index 9251deca876e821dace59682ca1a151555095c69..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/fastSweepingMapConfig.h +++ /dev/null @@ -1,39 +0,0 @@ -/*************************************************************************** - fastSweepingConfig.h - description - ------------------- - begin : Oct 15, 2015 - copyright : (C) 2015 by Tomas Sobotik - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef FASTSWEEPINGCONFIG_H_ -#define FASTSWEEPINGCONFIG_H_ - -#include <config/tnlConfigDescription.h> - -template< typename ConfigTag > -class fastSweepingMapConfig -{ - public: - static void configSetup( tnlConfigDescription& config ) - { - config.addDelimiter( "Parallel Eikonal solver settings:" ); - config.addEntry < String > ( "problem-name", "This defines particular problem.", "fast-sweeping" ); - config.addRequiredEntry < String > ( "initial-condition", "Initial condition for solver"); - config.addRequiredEntry < int > ( "dim", "Dimension of problem."); - config.addEntry < String > ( "mesh", "Name of mesh.", "mesh.tnl" ); - config.addEntry < String > ( "exact-input", "Are the function values near the curve equal to the SDF? (yes/no)", "no" ); - config.addRequiredEntry < String > ( "map", "Gradient map for solver"); - } -}; - -#endif /* FASTSWEEPINGCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.cpp b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.cpp deleted file mode 100644 index 8849008ff630db0400a6d7d98e789099e5fbb5d9..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.cu b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.cu deleted file mode 100644 index 8849008ff630db0400a6d7d98e789099e5fbb5d9..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.cu +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.h deleted file mode 100644 index 6f23851c2ea111712b9d65cfdbb613b04c1e1cdd..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/main.h +++ /dev/null @@ -1,88 +0,0 @@ -/*************************************************************************** - main.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - - -#include "MainBuildConfig.h" - //for HOST versions: -#include "tnlFastSweepingMap.h" - //for DEVICE versions: -//#include "tnlFastSweepingMap_CUDA.h" -#include "fastSweepingMapConfig.h" -#include <solvers/tnlBuildConfigTags.h> - -#include <mesh/tnlGrid.h> -#include <core/tnlDevice.h> -#include <time.h> -#include <ctime> - -typedef MainBuildConfig BuildConfig; - -int main( int argc, char* argv[] ) -{ - time_t start; - time_t stop; - time(&start); - std::clock_t start2= std::clock(); - Config::ParameterContainer parameters; - tnlConfigDescription configDescription; - fastSweepingMapConfig< BuildConfig >::configSetup( configDescription ); - - if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) - return false; - - const int& dim = parameters.getParameter< int >( "dim" ); - - if(dim == 2) - { - tnlFastSweepingMap<tnlGrid<2,double,TNL::Devices::Host, int>, double, int> solver; - if(!solver.init(parameters)) - { - cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - TNL_CHECK_CUDA_DEVICE; - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver..." <<std::endl; - solver.run(); - } -// else if(dim == 3) -// { -// tnlFastSweepingMap<tnlGrid<3,double,TNL::Devices::Host, int>, double, int> solver; -// if(!solver.init(parameters)) -// { -// cerr << "Solver failed to initialize." <<std::endl; -// return EXIT_FAILURE; -// } -// TNL_CHECK_CUDA_DEVICE; -// std::cout << "-------------------------------------------------------------" <<std::endl; -// std::cout << "Starting solver..." <<std::endl; -// solver.run(); -// } - else - { - std::cerr << "Unsupported number of dimensions: " << dim << "!" <<std::endl; - return EXIT_FAILURE; - } - - - time(&stop); - std::cout << "Solver stopped..." <<std::endl; - std::cout <<std::endl; - std::cout << "Running time was: " << difftime(stop,start) << " .... " << (std::clock() - start2) / (double)(CLOCKS_PER_SEC) <<std::endl; - return EXIT_SUCCESS; -} - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap.h deleted file mode 100644 index c568329ba2aa5fdb8fed303d43b25e73f210c014..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap.h +++ /dev/null @@ -1,188 +0,0 @@ -/*************************************************************************** - tnlFastSweepingMap.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING_H_ -#define TNLFASTSWEEPING_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <functions/tnlMeshFunction.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> -#include <limits.h> -#include <core/tnlDevice.h> -#include <ctime> -#ifdef HAVE_OPENMP -#include <omp.h> -#endif - - - - -template< typename Mesh, - typename Real, - typename Index > -class tnlFastSweepingMap -{}; - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 2, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - - tnlFastSweepingMap(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - - bool initGrid(); - bool run(); - - //for single core version use this implementation: - void updateValue(const Index i, const Index j); - //for parallel version use this one instead: -// void updateValue(const Index i, const Index j, DofVectorType* grid); - - - void setupSquare1000(Index i, Index j); - void setupSquare1100(Index i, Index j); - void setupSquare1010(Index i, Index j); - void setupSquare1001(Index i, Index j); - void setupSquare1110(Index i, Index j); - void setupSquare1101(Index i, Index j); - void setupSquare1011(Index i, Index j); - void setupSquare1111(Index i, Index j); - void setupSquare0000(Index i, Index j); - void setupSquare0100(Index i, Index j); - void setupSquare0010(Index i, Index j); - void setupSquare0001(Index i, Index j); - void setupSquare0110(Index i, Index j); - void setupSquare0101(Index i, Index j); - void setupSquare0011(Index i, Index j); - void setupSquare0111(Index i, Index j); - - Real fabsMin(const Real x, const Real y); - - -protected: - - MeshType Mesh; - - bool exactInput; - - int something_changed; - - tnlMeshFunction<MeshType> dofVector, dofVector2; - DofVectorType data,map; - - RealType h; - - tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage > Entity; - - -#ifdef HAVE_OPENMP -// omp_lock_t* gridLock; -#endif - - -}; - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweepingMap< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 3, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - tnlFastSweepingMap(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - - bool initGrid(); - bool run(); - - //for single core version use this implementation: - void updateValue(const Index i, const Index j, const Index k); - //for parallel version use this one instead: -// void updateValue(const Index i, const Index j, DofVectorType* grid); - - Real fabsMin(const Real x, const Real y); - - -protected: - - MeshType Mesh; - - bool exactInput; - - - tnlMeshFunction<MeshType> dofVector, dofVector2; - DofVectorType data; - - RealType h; - - tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage > Entity; - -#ifdef HAVE_OPENMP -// omp_lock_t* gridLock; -#endif - - -}; - - - //for single core version use this implementation: -#include "tnlFastSweepingMap2D_impl.h" - //for parallel version use this one instead: -// #include "tnlFastSweepingMap2D_openMP_impl.h" - -// #include "tnlFastSweepingMap3D_impl.h" - -#endif /* TNLFASTSWEEPING_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap2D_CUDA_v4_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap2D_CUDA_v4_impl.h deleted file mode 100644 index d02b8d6c5d40f8f581e160201c952777ba15aefe..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap2D_CUDA_v4_impl.h +++ /dev/null @@ -1,1051 +0,0 @@ -/*************************************************************************** - tnlFastSweepingMap2D_CUDA_v4_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweepingMap.h" - -#define MAP_SOLVER_MAX_VALUE 3 - -__device__ -double fabsMin( double x, double y) -{ - double fx = abs(x); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; -} - -__device__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(__longlong_as_double(assumed),val) )); - } while (assumed != old); - return __longlong_as_double(old); -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweepingMap< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlFastSweepingMap() -:dofVector(Mesh) -{ -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - const String& mapFile = parameters.getParameter <String>("map"); - if(! this->map.load( mapFile )) - cout << "Failed to load map file : " << mapFile <<std::endl; - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - //Entity.refresh(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(map_cuda), this->map.getSize()*sizeof(double)); - cudaMemcpy(map_cuda, this->map.getData(), this->map.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(changed), sizeof(int)); - //counter == 0 --> setting changed to 0 - cudaMemcpy(changed, &counter, sizeof(int), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1); - - - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(1, 1024); - dim3 numBlocks(4,1); - - int run = 1; - int zero = 0; - int cntr = 0; - - while(run != 0) - { - cudaMemcpy(this->changed, &zero, sizeof(int), cudaMemcpyHostToDevice); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,0,0, this->changed); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(&run, this->changed,sizeof(int), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - cntr++; - cout << "Finished set of sweeps #" << cntr << " " << run <<std::endl; - } - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - //data.setLike(dofVector.getData()); - //cudaMemcpy(data.getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaMemcpy(dofVector.getData().getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - //data.save("u-00001.tnl"); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, Index* something_changed) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - - if(map_cuda[Entity.getIndex()] != 0.0) - { - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real value = cudaDofVector2[Entity.getIndex()]; - Real im = abs(1.0/map_cuda[Entity.getIndex()]); - Real a,b, tmp; - - if( i == 0 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(abs(a-b) >= im*h) - tmp = fabsMin(a,b) + sign(value)*im*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * im * h * im * h - (a - b) * (a - b) ) ); - - // cudaDofVector2[Entity.getIndex()] = fabsMin(value, tmp); - atomicFabsMin(&(cudaDofVector2[Entity.getIndex()]), tmp); - - if(abs(value)-abs(tmp) > 0.0) - atomicMax(something_changed,1); - } - else - { - atomicFabsMin(&(cudaDofVector2[Entity.getIndex()]), MAP_SOLVER_MAX_VALUE); - } - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int i = threadIdx.x + blockDim.x*blockIdx.x; - int j = blockDim.y*blockIdx.y + threadIdx.y; - - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - int gid = Entity.getIndex(); - - cudaDofVector2[gid] = INT_MAX*sign(cudaDofVector[gid]); - - if(abs(cudaDofVector[gid]) < 1.01*h) - { - cudaDofVector2[gid] = cudaDofVector[gid]; - if(map_cuda[gid] != 0.0) - cudaDofVector2[gid] /=map_cuda[gid]; - } - - - - - -// if(i+1 < Mesh.getDimensions().x() && j+1 < Mesh.getDimensions().y() ) -// { -// if(cudaDofVector[Entity.getIndex()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1111(i,j); -// else -// setupSquare1110(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1101(i,j); -// else -// setupSquare1100(i,j); -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1011(i,j); -// else -// setupSquare1010(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1001(i,j); -// else -// setupSquare1000(i,j); -// } -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0111(i,j); -// else -// setupSquare0110(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0101(i,j); -// else -// setupSquare0100(i,j); -// } -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0011(i,j); -// else -// setupSquare0010(i,j); -// } -// else -// { -// if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0001(i,j); -// else -// setupSquare0000(i,j); -// } -// } -// } -// -// } - - return true; - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - //Real fy = abs(y); - - //Real tmpMin = Min(fx,abs(y)); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlFastSweepingMap< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i, int* changed) -{ - - __shared__ int something_changed; - if(threadIdx.x+threadIdx.y == 0) - something_changed = 0; - - int gx = 0; - int gy = threadIdx.y; - //if(solver->Mesh.getDimensions().x() <= gx || solver->Mesh.getDimensions().y() <= gy) - // return; - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - //int gid = solver->Mesh.getDimensions().x() * gy + gx; - //int max = solver->Mesh.getDimensions().x()*solver->Mesh.getDimensions().x(); - - //int id1 = gx+gy; - //int id2 = (solver->Mesh.getDimensions().x() - gx - 1) + gy; - - __syncthreads(); - if(blockIdx.x==0) - { - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,&something_changed); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==1) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,&something_changed); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==2) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,&something_changed); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==3) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,&something_changed); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - - - if(threadIdx.x+threadIdx.y == 0) - atomicMax(changed, something_changed); - - - - -} - - -__global__ void initCUDA(tnlFastSweepingMap< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - - - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(INT_MAX,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} -#endif - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap2D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap2D_impl.h deleted file mode 100644 index 4bd9e17c5626c7fcbbe0b747a2011d0d74ac9809..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap2D_impl.h +++ /dev/null @@ -1,823 +0,0 @@ -/*************************************************************************** - tnlFastSweepingMap2D_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - - -#define MAP_SOLVER_MAX_VALUE 3 - - -#include "tnlFastSweepingMap.h" - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweepingMap< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlFastSweepingMap() -:Entity(Mesh), - dofVector(Mesh), - dofVector2(Mesh) -{ -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - dofVector2.load(initialCondition); - - const String& mapFile = parameters.getParameter <String>("map"); - if(! this->map.load( mapFile )) - cout << "Failed to load map file : " << mapFile <<std::endl; - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - Entity.refresh(); - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - cout << "a" <<std::endl; - - something_changed = 1; - return initGrid(); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - for(int i=0; i< Mesh.getDimensions().x()*Mesh.getDimensions().x();i++) - { - dofVector2[i]=INT_MAX*sign(dofVector[i]); - - if(abs(dofVector[i]) < 1.01*h) - { - dofVector2[i] = dofVector[i]; - if(map[i] != 0.0) - dofVector2[i] /= map[i]; - } - } - -// for(int i = 0 ; i < Mesh.getDimensions().x()-1; i++) -// { -// for(int j = 0 ; j < Mesh.getDimensions().x()-1; j++) -// { -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// neighborEntities.refresh(Mesh,Entity.getIndex()); -// -// if(dofVector[this->Entity.getIndex()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1111(i,j); -// else -// setupSquare1110(i,j); -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1101(i,j); -// else -// setupSquare1100(i,j); -// } -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1011(i,j); -// else -// setupSquare1010(i,j); -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare1001(i,j); -// else -// setupSquare1000(i,j); -// } -// } -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0111(i,j); -// else -// setupSquare0110(i,j); -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0101(i,j); -// else -// setupSquare0100(i,j); -// } -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0011(i,j); -// else -// setupSquare0010(i,j); -// } -// else -// { -// if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) -// setupSquare0001(i,j); -// else -// setupSquare0000(i,j); -// } -// } -// } -// -// } -// } - cout << "a" <<std::endl; - - //data.setLike(dofVector2.getData()); - //data=dofVector2.getData(); - //cout << data.getType() <<std::endl; - dofVector2.save("u-00000.tnl"); - //dofVector2.getData().save("u-00000.tnl"); - - return true; -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - int cntr = 0; - while(something_changed != 0) - { - something_changed = 0; - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j); - } - } - - /*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j); - } - } - - /*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j); - } - } - - /*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j); - } - } - - /*---------------------------------------------------------------------------------------------------------------------------*/ - cntr++; - cout << "Finished set of sweeps #" << cntr << " " << something_changed <<std::endl; - } - - - - dofVector2.save("u-00001.tnl"); - - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - if(map[Entity.getIndex()] != 0.0) - { - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - Real value = dofVector2[Entity.getIndex()]; - Real im = abs(1.0/map[Entity.getIndex()]); - Real a,b, tmp; - - if( i == 0 ) - a = dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = dofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( dofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(fabs(a-b) >= im*h) - tmp = fabsMin(a,b) + sign(value)*im*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * im * h * im * h - (a - b) * (a - b) ) ); - - if(abs(value)-abs(tmp) > 0.0) - something_changed = 1; - - dofVector2[Entity.getIndex()] = fabsMin(value, tmp); - - } - else - { - dofVector2[Entity.getIndex()] = MAP_SOLVER_MAX_VALUE; - } -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -Real tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = fabs(x); - Real fy = fabs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// auto neighborEntities = Entity.getNeighborEntities(); -// dofVector2[Entity.getIndex()]=fabsMin(INT_MAX,dofVector2[Entity.getIndex()]); -// dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// auto neighborEntities = Entity.getNeighborEntities(); -// dofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,dofVector2[(Entity.getIndex())]); -// dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - dofVector2[Entity.getIndex()]=fabsMin(dofVector[Entity.getIndex()],dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - dofVector2[Entity.getIndex()]=fabsMin(dofVector[Entity.getIndex()],dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap_CUDA.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap_CUDA.h deleted file mode 100644 index a23057e78c745e74467db4c4190d6f217024bc5a..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping-map/tnlFastSweepingMap_CUDA.h +++ /dev/null @@ -1,196 +0,0 @@ -/*************************************************************************** - tnlFastSweepingMap_CUDA.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING_H_ -#define TNLFASTSWEEPING_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> - -#include <functions/tnlMeshFunction.h> -#include <limits.h> -#include <core/tnlDevice.h> -#include <ctime> - - - - - -template< typename Mesh, - typename Real, - typename Index > -class tnlFastSweepingMap -{}; - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 2, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - tnlFastSweepingMap(); - - __host__ static String getType(); - __host__ bool init( const Config::ParameterContainer& parameters ); - __host__ bool run(); - -#ifdef HAVE_CUDA - __device__ bool initGrid(); - __device__ void updateValue(const Index i, const Index j, Index* something_changed); - __device__ void updateValue(const Index i, const Index j, double** sharedMem, const int k3); - __device__ Real fabsMin(const Real x, const Real y); - - tnlFastSweepingMap< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >* cudaSolver; - double* cudaDofVector; - double* cudaDofVector2; - double* map_cuda; - int counter; - int* changed; - __device__ void setupSquare1000(Index i, Index j); - __device__ void setupSquare1100(Index i, Index j); - __device__ void setupSquare1010(Index i, Index j); - __device__ void setupSquare1001(Index i, Index j); - __device__ void setupSquare1110(Index i, Index j); - __device__ void setupSquare1101(Index i, Index j); - __device__ void setupSquare1011(Index i, Index j); - __device__ void setupSquare1111(Index i, Index j); - __device__ void setupSquare0000(Index i, Index j); - __device__ void setupSquare0100(Index i, Index j); - __device__ void setupSquare0010(Index i, Index j); - __device__ void setupSquare0001(Index i, Index j); - __device__ void setupSquare0110(Index i, Index j); - __device__ void setupSquare0101(Index i, Index j); - __device__ void setupSquare0011(Index i, Index j); - __device__ void setupSquare0111(Index i, Index j); -#endif - - MeshType Mesh; - -protected: - - - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector; - DofVectorType data, map; - - - RealType h; - - -}; - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweepingMap< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 3, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - - - __host__ static String getType(); - __host__ bool init( const Config::ParameterContainer& parameters ); - __host__ bool run(); - -#ifdef HAVE_CUDA - __device__ bool initGrid(int i, int j, int k); - __device__ void updateValue(const Index i, const Index j, const Index k); - __device__ void updateValue(const Index i, const Index j, const Index k, double** sharedMem, const int k3); - __device__ Real fabsMin(const Real x, const Real y); - - tnlFastSweepingMap< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >* cudaSolver; - double* cudaDofVector; - double* cudaDofVector2; - int counter; -#endif - - MeshType Mesh; - -protected: - - - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector; - DofVectorType data; - - RealType h; - - -}; - - - - - - - -#ifdef HAVE_CUDA -//template<int sweep_t> -__global__ void runCUDA(tnlFastSweepingMap< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i, int* changed); -//__global__ void runCUDA(tnlFastSweepingMap< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i); - -__global__ void initCUDA(tnlFastSweepingMap< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver); -//__global__ void initCUDA(tnlFastSweepingMap< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver); -#endif - -/*various implementtions.... choose one*/ -//#include "tnlFastSweepingMap2D_CUDA_impl.h" -//#include "tnlFastSweepingMap2D_CUDA_v2_impl.h" -//#include "tnlFastSweepingMap2D_CUDA_v3_impl.h" -#include "tnlFastSweepingMap2D_CUDA_v4_impl.h" -//#include "tnlFastSweepingMap2D_CUDA_v5_impl.h" - - -// #include "tnlFastSweepingMap3D_CUDA_impl.h" - -#endif /* TNLFASTSWEEPING_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/CMakeLists.txt b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/CMakeLists.txt deleted file mode 100644 index 1a23d646a43090c0a63216b43c317c14ab0903d3..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -set( tnl_fast_sweeping_SOURCES -# MainBuildConfig.h -# tnlFastSweeping2D_impl.h -# tnlFastSweeping.h -# fastSweepingConfig.h - main.cpp) - - -IF( BUILD_CUDA ) - CUDA_ADD_EXECUTABLE(fast-sweeping main.cu) -ELSE( BUILD_CUDA ) - ADD_EXECUTABLE(fast-sweeping main.cpp) -ENDIF( BUILD_CUDA ) -target_link_libraries (fast-sweeping tnl ) - - -INSTALL( TARGETS fast-sweeping - RUNTIME DESTINATION bin - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) - -#INSTALL( FILES ${tnl_fast_sweeping_SOURCES} -# DESTINATION ${TNL_TARGET_DATA_DIRECTORY}/examples/fast-sweeping ) diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/MainBuildConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/MainBuildConfig.h deleted file mode 100644 index ed3d686eb99379af1589d734eac9b5812cccdedf..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/MainBuildConfig.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - MainBuildConfig.h - description - ------------------- - begin : Jul 7, 2014 - copyright : (C) 2014 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef MAINBUILDCONFIG_H_ -#define MAINBUILDCONFIG_H_ - -#include <solvers/tnlBuildConfigTags.h> - -class MainBuildConfig -{ - public: - - static void print() {std::cerr << "MainBuildConfig" <<std::endl; } -}; - -/**** - * Turn off support for float and long double. - */ -template<> struct tnlConfigTagReal< MainBuildConfig, float > { enum { enabled = false }; }; -template<> struct tnlConfigTagReal< MainBuildConfig, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct tnlConfigTagIndex< MainBuildConfig, short int >{ enum { enabled = false }; }; -template<> struct tnlConfigTagIndex< MainBuildConfig, long int >{ enum { enabled = false }; }; - -/**** - * Use of tnlGrid is enabled for allowed dimensions and Real, Device and Index types. - */ -template< int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< MainBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< MainBuildConfig, Dimensions >::enabled && - tnlConfigTagReal< MainBuildConfig, Real >::enabled && - tnlConfigTagDevice< MainBuildConfig, Device >::enabled && - tnlConfigTagIndex< MainBuildConfig, Index >::enabled }; }; - -/**** - * Please, chose your preferred time discretisation here. - */ -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = false}; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; - -/**** - * Only the Runge-Kutta-Merson solver is enabled by default. - */ -template<> struct tnlConfigTagExplicitSolver< MainBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; - -#endif /* MAINBUILDCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/fastSweepingConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/fastSweepingConfig.h deleted file mode 100644 index 3df2c1e889050448fc07baf7dcd0e32feab3f778..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/fastSweepingConfig.h +++ /dev/null @@ -1,38 +0,0 @@ -/*************************************************************************** - fastSweepingConfig.h - description - ------------------- - begin : Oct 15, 2015 - copyright : (C) 2015 by Tomas Sobotik - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef FASTSWEEPINGCONFIG_H_ -#define FASTSWEEPINGCONFIG_H_ - -#include <config/tnlConfigDescription.h> - -template< typename ConfigTag > -class fastSweepingConfig -{ - public: - static void configSetup( tnlConfigDescription& config ) - { - config.addDelimiter( "Parallel Eikonal solver settings:" ); - config.addEntry < String > ( "problem-name", "This defines particular problem.", "fast-sweeping" ); - config.addRequiredEntry < String > ( "initial-condition", "Initial condition for solver"); - config.addRequiredEntry < int > ( "dim", "Dimension of problem."); - config.addEntry < String > ( "mesh", "Name of mesh.", "mesh.tnl" ); - config.addEntry < String > ( "exact-input", "Are the function values near the curve equal to the SDF? (yes/no)", "no" ); - } -}; - -#endif /* FASTSWEEPINGCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.cpp b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.cpp deleted file mode 100644 index 8849008ff630db0400a6d7d98e789099e5fbb5d9..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.cu b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.cu deleted file mode 100644 index 8849008ff630db0400a6d7d98e789099e5fbb5d9..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.cu +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.h deleted file mode 100644 index e5ac15fede2281abbd31320985de93671d63d178..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/main.h +++ /dev/null @@ -1,88 +0,0 @@ -/*************************************************************************** - main.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - - -#include "MainBuildConfig.h" - //for HOST versions: -#include "tnlFastSweeping.h" - //for DEVICE versions: -//#include "tnlFastSweeping_CUDA.h" -#include "fastSweepingConfig.h" -#include <solvers/tnlBuildConfigTags.h> - -#include <mesh/tnlGrid.h> -#include <core/tnlDevice.h> -#include <time.h> -#include <ctime> - -typedef MainBuildConfig BuildConfig; - -int main( int argc, char* argv[] ) -{ - time_t start; - time_t stop; - time(&start); - std::clock_t start2= std::clock(); - Config::ParameterContainer parameters; - tnlConfigDescription configDescription; - fastSweepingConfig< BuildConfig >::configSetup( configDescription ); - - if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) - return false; - - const int& dim = parameters.getParameter< int >( "dim" ); - - if(dim == 2) - { - tnlFastSweeping<tnlGrid<2,double,TNL::Devices::Host, int>, double, int> solver; - if(!solver.init(parameters)) - { - cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - TNL_CHECK_CUDA_DEVICE; - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver..." <<std::endl; - solver.run(); - } - else if(dim == 3) - { - tnlFastSweeping<tnlGrid<3,double,TNL::Devices::Host, int>, double, int> solver; - if(!solver.init(parameters)) - { - cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - TNL_CHECK_CUDA_DEVICE; - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver..." <<std::endl; - solver.run(); - } - else - { - std::cerr << "Unsupported number of dimensions: " << dim << "!" <<std::endl; - return EXIT_FAILURE; - } - - - time(&stop); - std::cout << "Solver stopped..." <<std::endl; - std::cout <<std::endl; - std::cout << "Running time was: " << difftime(stop,start) << " .... " << (std::clock() - start2) / (double)(CLOCKS_PER_SEC) <<std::endl; - return EXIT_SUCCESS; -} - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping.h deleted file mode 100644 index 96d26db7b5a2077d8e2199292f0e888b0171a5c2..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping.h +++ /dev/null @@ -1,186 +0,0 @@ -/*************************************************************************** - tnlFastSweeping.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING_H_ -#define TNLFASTSWEEPING_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <functions/tnlMeshFunction.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> -#include <limits.h> -#include <core/tnlDevice.h> -#include <ctime> -#ifdef HAVE_OPENMP -#include <omp.h> -#endif - - - - -template< typename Mesh, - typename Real, - typename Index > -class tnlFastSweeping -{}; - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 2, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - - tnlFastSweeping(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - - bool initGrid(); - bool run(); - - //for single core version use this implementation: - void updateValue(const Index i, const Index j); - //for parallel version use this one instead: -// void updateValue(const Index i, const Index j, DofVectorType* grid); - - - void setupSquare1000(Index i, Index j); - void setupSquare1100(Index i, Index j); - void setupSquare1010(Index i, Index j); - void setupSquare1001(Index i, Index j); - void setupSquare1110(Index i, Index j); - void setupSquare1101(Index i, Index j); - void setupSquare1011(Index i, Index j); - void setupSquare1111(Index i, Index j); - void setupSquare0000(Index i, Index j); - void setupSquare0100(Index i, Index j); - void setupSquare0010(Index i, Index j); - void setupSquare0001(Index i, Index j); - void setupSquare0110(Index i, Index j); - void setupSquare0101(Index i, Index j); - void setupSquare0011(Index i, Index j); - void setupSquare0111(Index i, Index j); - - Real fabsMin(const Real x, const Real y); - - -protected: - - MeshType Mesh; - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector, dofVector2; - DofVectorType data; - - RealType h; - - tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage > Entity; - - -#ifdef HAVE_OPENMP -// omp_lock_t* gridLock; -#endif - - -}; - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 3, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - tnlFastSweeping(); - - static String getType(); - bool init( const Config::ParameterContainer& parameters ); - - bool initGrid(); - bool run(); - - //for single core version use this implementation: - void updateValue(const Index i, const Index j, const Index k); - //for parallel version use this one instead: -// void updateValue(const Index i, const Index j, DofVectorType* grid); - - Real fabsMin(const Real x, const Real y); - - -protected: - - MeshType Mesh; - - bool exactInput; - - - tnlMeshFunction<MeshType> dofVector, dofVector2; - DofVectorType data; - - RealType h; - - tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage > Entity; - -#ifdef HAVE_OPENMP -// omp_lock_t* gridLock; -#endif - - -}; - - - //for single core version use this implementation: -#include "tnlFastSweeping2D_impl.h" - //for parallel version use this one instead: -// #include "tnlFastSweeping2D_openMP_impl.h" - -#include "tnlFastSweeping3D_impl.h" - -#endif /* TNLFASTSWEEPING_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_impl.h deleted file mode 100644 index bc1da169c01466a69c00b24e450e5eba09aacd1a..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_impl.h +++ /dev/null @@ -1,522 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_CUDA_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.getSpaceSteps().x(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1); - - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ -// -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// -// dofVector.save("u-00001.tnl"); - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(32, 32); - dim3 numBlocks(n/32 + 1 ,n/32 +1); - - for(int i = 2*n - 1; i > -1; i--) - { - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,4,i); - cudaDeviceSynchronize(); - } - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - for(int i = 0; i < 2*n ; i++) - { - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,1,i); - cudaDeviceSynchronize(); - } - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - for(int i = 0; i < 2*n ; i++) - { - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,2,i); - cudaDeviceSynchronize(); - } - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - for(int i = 2*n - 1; i > -1; i--) - { - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,3,i); - cudaDeviceSynchronize(); - } - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(this->dofVector.getData(), cudaDofVector, this->dofVector.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - Index index = Mesh.getCellIndex(CoordinatesType(i,j)); - Real value = cudaDofVector[index]; - Real a,b, tmp; - - if( i == 0 ) - a = cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)]; - else - { - a = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)], - cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)] ); - } - - if( j == 0 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)]; - else - { - b = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)], - cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - cudaDofVector[index] = fabsMin(value, tmp); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - int gid = Mesh.getCellIndex(CoordinatesType(gx,gy)); - - int total = blockDim.x*gridDim.x; - - - - Real tmp = 0.0; - int flag = 0; - counter = 0; - tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - - - if(!exactInput) - { - cudaDofVector[gid]=cudaDofVector[gid]=0.5*h*sign(cudaDofVector[gid]); - } - __threadfence(); -// printf("-----------------------------------------------------------------------------------\n"); - - __threadfence(); - - if(gx > 0 && gx < Mesh.getDimensions().x()-1) - { - if(gy > 0 && gy < Mesh.getDimensions().y()-1) - { - - Index j = gy; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag=1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - } - -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); -// printf("****************************************************************\n"); -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == 0) - { -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - Index j = 0; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == Mesh.getDimensions().y() - 1) - { - Index i = gx; - Index j = Mesh.getDimensions().y() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == 0) - { - Index j = gy; - Index i = 0; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } -// printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == Mesh.getDimensions().x() - 1) - { - Index j = gy; - Index i = Mesh.getDimensions().x() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("##################################################################################################\n"); - if(gx == Mesh.getDimensions().x() - 1 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == Mesh.getDimensions().x() - 1 && - gy == 0) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } -// printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); - if(gx == 0 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == 0 && - gy == 0) - { -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - - __threadfence(); - - if(flag==1) - cudaDofVector[gid] = tmp*3; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - Real fy = abs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - if(solver->Mesh.getDimensions().x() <= gx || solver->Mesh.getDimensions().y() <= gy) - return; - int total = solver->Mesh.getDimensions().x(); - //int gid = solver->Mesh.getDimensions().x() * gy + gx; - int max = solver->Mesh.getDimensions().x()*solver->Mesh.getDimensions().x(); - - int id1 = gx+gy; - int id2 = (solver->Mesh.getDimensions().x() - gx - 1) + gy; - - /*---------------------------------------------------------------------------------------------------------------------------*/ - if(sweep == 1) -// for(int i = 0; i < 2*total - 1; i++) - { - if(id1 == i) - { - solver->updateValue(gx,gy); - return; - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - else if(sweep == 2) -// for(int i = 0; i < 2*total - 1; i++) - { - if(id2 == i) - { - solver->updateValue(gx,gy); - return; - } - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - else if(sweep == 3) -// for(int i = 2*total - 2; i > -1; i--) - { - if(id1 == i) - { - solver->updateValue(gx,gy); - return; - } - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - else if(sweep == 4) -// for(int i = 2*total - 2; i > -1; i--) - { - if(id2 == i) - { - solver->updateValue(gx,gy); - return; - } - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - - - -} - - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} -#endif - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v2_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v2_impl.h deleted file mode 100644 index 3ad5b7944f839f794f695240e7abba59e23d16b4..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v2_impl.h +++ /dev/null @@ -1,588 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_CUDA_v2_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.getSpaceSteps().x(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1); - - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ -// -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// -// dofVector.save("u-00001.tnl"); - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(27, 27); - dim3 numBlocks(1 ,1); - -// for(int i = 2*n - 1; i > -1; i--) - { - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,4,0); - cudaDeviceSynchronize(); - } - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; -//// for(int i = 0; i < 2*n ; i++) -// { -// runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,1,0); -// cudaDeviceSynchronize(); -// } -// cudaDeviceSynchronize(); -// TNL_CHECK_CUDA_DEVICE; -//// for(int i = 0; i < 2*n ; i++) -// { -// runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,2,0); -// cudaDeviceSynchronize(); -// } -// cudaDeviceSynchronize(); -// TNL_CHECK_CUDA_DEVICE; -//// for(int i = 2*n - 1; i > -1; i--) -// { -// runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,3,0); -// cudaDeviceSynchronize(); -// } -// -// cudaDeviceSynchronize(); -// TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(this->dofVector.getData(), cudaDofVector, this->dofVector.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - Index index = Mesh.getCellIndex(CoordinatesType(i,j)); - Real value = cudaDofVector[index]; - Real a,b, tmp; - - if( i == 0 ) - a = cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)]; - else - { - a = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)], - cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)] ); - } - - if( j == 0 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)]; - else - { - b = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)], - cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - cudaDofVector[index] = fabsMin(value, tmp); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - int gid = Mesh.getCellIndex(CoordinatesType(gx,gy)); - - int total = blockDim.x*gridDim.x; - - - - Real tmp = 0.0; - int flag = 0; - counter = 0; - tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - - - if(!exactInput) - { - cudaDofVector[gid]=cudaDofVector[gid]=0.5*h*sign(cudaDofVector[gid]); - } - __threadfence(); -// printf("-----------------------------------------------------------------------------------\n"); - - __threadfence(); - - if(gx > 0 && gx < Mesh.getDimensions().x()-1) - { - if(gy > 0 && gy < Mesh.getDimensions().y()-1) - { - - Index j = gy; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag=1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - } - -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); -// printf("****************************************************************\n"); -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == 0) - { -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - Index j = 0; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == Mesh.getDimensions().y() - 1) - { - Index i = gx; - Index j = Mesh.getDimensions().y() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == 0) - { - Index j = gy; - Index i = 0; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } -// printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == Mesh.getDimensions().x() - 1) - { - Index j = gy; - Index i = Mesh.getDimensions().x() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("##################################################################################################\n"); - if(gx == Mesh.getDimensions().x() - 1 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == Mesh.getDimensions().x() - 1 && - gy == 0) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } -// printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); - if(gx == 0 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == 0 && - gy == 0) - { -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - - __threadfence(); - - if(flag==1) - cudaDofVector[gid] = tmp*3; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - - Real tmpMin = Min(fx,abs(y)); - - if(tmpMin == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) -{ - - //int gx = threadIdx.x; - //int gy = threadIdx.y; - int id1,id2; - int nx = solver->Mesh.getDimensions().x()+ threadIdx.x; - int ny = solver->Mesh.getDimensions().y()+ threadIdx.y; - - int blockCount = solver->Mesh.getDimensions().x()/blockDim.x + 1; - - for(int gy = threadIdx.y; gy < ny;gy+=blockDim.y) - { - for(int gx = threadIdx.x; gx < nx;gx+=blockDim.x) - { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy && gy > -1&& gx > -1) - { - id1 = threadIdx.x+threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - } - __syncthreads(); - } - - } - //gx+=blockDim.x; - //__syncthreads(); - } - //gx = threadIdx.x; - //gy+=blockDim.y; - //__syncthreads(); - } - /*---------------------------------------------------------------------------------------------------------------------------*/ -// gx = blockDim.x*(blockCount-1) + threadIdx.x; -// gy = threadIdx.y; - for(int gy = threadIdx.y; gy < ny;gy+=blockDim.y) - { - for(int gx = blockDim.x*(blockCount-1) + threadIdx.x; gx >- 1;gx-=blockDim.x) - { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy && gy > -1&& gx > -1) - { - id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - } - __syncthreads(); - } - } - //gx-=blockDim.x; - //__syncthreads(); - } - //gx = blockDim.x*(blockCount-1) + threadIdx.x; - //gy+=blockDim.y; - //__syncthreads(); - } - /*---------------------------------------------------------------------------------------------------------------------------*/ -// gx = blockDim.x*(blockCount-1) + threadIdx.x; -// gy = blockDim.x*(blockCount-1) + threadIdx.y; - for(int gy = blockDim.x*(blockCount-1) +threadIdx.y; gy >- 1;gy-=blockDim.y) - { - for(int gx = blockDim.x*(blockCount-1) + threadIdx.x; gx >- 1;gx-=blockDim.x) - { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy && gy > -1&& gx > -1) - { - id1 = threadIdx.x+threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - } - __syncthreads(); - } - } - //gx-=blockDim.x; - //__syncthreads(); - } - //gx = blockDim.x*(blockCount-1) + threadIdx.x; - //gy-=blockDim.y; - //__syncthreads(); - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - //gx = threadIdx.x; - //gy = blockDim.x*(blockCount-1) +threadIdx.y; - for(int gy = blockDim.x*(blockCount-1) +threadIdx.y; gy >- 1;gy-=blockDim.y) - { - for(int gx = threadIdx.x; gx < nx;gx+=blockDim.x) - { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy && gy > -1&& gx > -1) - { - id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - } - __syncthreads(); - } - } - //gx+=blockDim.x; - //__syncthreads(); - } - //gx = threadIdx.x; - //gy-=blockDim.y; - ///__syncthreads(); - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - - - - -} - - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} -#endif - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v3_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v3_impl.h deleted file mode 100644 index ff36d3f8e0a73e5a0987b06f81be2650b277fa25..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v3_impl.h +++ /dev/null @@ -1,920 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_CUDA_v3_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - - - - -__device__ double atomicSet(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong(val )); - } while (assumed != old); - return __longlong_as_double(old); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.getSpaceSteps().x(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1); - - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ -// -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// -// dofVector.save("u-00001.tnl"); - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 +1 ,n/16 +1); - int m =n/16 +1; - - for(int i = 0; i < 2*m -1; i++) - { - runCUDA<15><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,1,i); - //cudaDeviceSynchronize(); - } -// cudaDeviceSynchronize(); -// TNL_CHECK_CUDA_DEVICE; -// for(int i = 0; i < 2*m -1; i++) -// { -// runCUDA<2><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,2,i); -// cudaDeviceSynchronize(); -// } -// cudaDeviceSynchronize(); -// TNL_CHECK_CUDA_DEVICE; -// for(int i = 0; i < 2*m -1; i++) -// { -// runCUDA<4><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,4,i); -// cudaDeviceSynchronize(); -// } -// cudaDeviceSynchronize(); -// TNL_CHECK_CUDA_DEVICE; -// for(int i = 0; i < 2*m -1; i++) -// { -// runCUDA<8><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,8,i); -// cudaDeviceSynchronize(); -// } - - - - -// for(int i = 0; i < (2*m -1)/4 -1; i++) -// { -// runCUDA<15><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,15,i);//all -// cudaDeviceSynchronize(); -// } -// for(int i = (2*m -1)/4 -1; i < (2*m -1)/2 -1; i++) -// { -// runCUDA<5><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,5,i); //two -// cudaDeviceSynchronize(); -// runCUDA<10><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,10,i); //two -// cudaDeviceSynchronize(); -// } -// for(int i = (2*m -1)/2 -1; i < (2*m -1)/2 +1; i++) -// { -// runCUDA<1><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,1,i); //separate -// cudaDeviceSynchronize(); -// runCUDA<2><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,2,i); //separate -// cudaDeviceSynchronize(); -// runCUDA<4><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,4,i); //separate -// cudaDeviceSynchronize(); -// runCUDA<8><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,8,i); //separate -// cudaDeviceSynchronize(); -// } -// for(int i = (2*m -1)/2 +1; i < (2*m -1/4)*3 +1; i++) -// { -// runCUDA<5><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,5,i); //two -// cudaDeviceSynchronize(); -// runCUDA<10><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,10,i); //two -// cudaDeviceSynchronize(); -// } -// for(int i = (2*m -1/4)*3 +1; i < 2*m -1; i++) -// { -// runCUDA<15><<<numBlocks,threadsPerBlock>>>(this->cudaSolver,15,i);//all -// cudaDeviceSynchronize(); -// } -cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(this->dofVector.getData(), cudaDofVector, this->dofVector.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - Index index = Mesh.getCellIndex(CoordinatesType(i,j)); - Real value = cudaDofVector[index]; - Real a,b, tmp; - - if( i == 0 ) - a = cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)]; - else - { - a = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)], - cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)] ); - } - - if( j == 0 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)]; - else - { - b = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)], - cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - atomicSet(&cudaDofVector[index],fabsMin(value, tmp)); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - int gid = Mesh.getCellIndex(CoordinatesType(gx,gy)); - - int total = blockDim.x*gridDim.x; - - - - Real tmp = 0.0; - int flag = 0; - counter = 0; - tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - - - if(!exactInput) - { - cudaDofVector[gid]=cudaDofVector[gid]=0.5*h*sign(cudaDofVector[gid]); - } - __threadfence(); -// printf("-----------------------------------------------------------------------------------\n"); - - __threadfence(); - - if(gx > 0 && gx < Mesh.getDimensions().x()-1) - { - if(gy > 0 && gy < Mesh.getDimensions().y()-1) - { - - Index j = gy; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag=1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - } - -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); -// printf("****************************************************************\n"); -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == 0) - { -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - Index j = 0; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == Mesh.getDimensions().y() - 1) - { - Index i = gx; - Index j = Mesh.getDimensions().y() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == 0) - { - Index j = gy; - Index i = 0; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } -// printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == Mesh.getDimensions().x() - 1) - { - Index j = gy; - Index i = Mesh.getDimensions().x() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("##################################################################################################\n"); - if(gx == Mesh.getDimensions().x() - 1 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == Mesh.getDimensions().x() - 1 && - gy == 0) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } -// printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); - if(gx == 0 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == 0 && - gy == 0) - { -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - - __threadfence(); - - if(flag==1) - cudaDofVector[gid] = tmp*3; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ -// Real fx = abs(x); -// -// Real tmpMin = Min(fx,abs(y)); - - if(abs(y) > abs(x)) - return x; - else - return y; - - -} - - -template<> -__global__ void runCUDA<1>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) -{ - - if(blockIdx.x+blockIdx.y == k) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id1 = threadIdx.x+threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ -} - template<> - __global__ void runCUDA<2>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) - { - if((gridDim.x - blockIdx.x - 1)+blockIdx.y == k) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - } - __syncthreads(); - } - - } - } /*---------------------------------------------------------------------------------------------------------------------------*/ - template<> - __global__ void runCUDA<4>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) - { - if(blockIdx.x+blockIdx.y == gridDim.x+gridDim.y-k-2) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id1 = threadIdx.x+threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - } - - template<> - __global__ void runCUDA<8>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) - { - if((gridDim.x - blockIdx.x - 1)+blockIdx.y == gridDim.x+gridDim.y-k-2) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - - - - -} - - - template<> - __global__ void runCUDA<5>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) - { - - if(blockIdx.x+blockIdx.y == k) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id1 = threadIdx.x+threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - else if(blockIdx.x+blockIdx.y == gridDim.x+gridDim.y-k-2) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id1 = threadIdx.x+threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - } - - - template<> - __global__ void runCUDA<10>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) - { - if((gridDim.x - blockIdx.x - 1)+blockIdx.y == k) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - - else if((gridDim.x - blockIdx.x - 1)+blockIdx.y == gridDim.x+gridDim.y-k-2) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - - } - - - - template<> - __global__ void runCUDA<15>(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) - { - - if(blockIdx.x+blockIdx.y == k) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id1 = threadIdx.x+threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - if((gridDim.x - blockIdx.x - 1)+blockIdx.y == k) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 0; l < 2*blockDim.x - 1; l++) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - if(blockIdx.x+blockIdx.y == gridDim.x+gridDim.y-k-2) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id1 = threadIdx.x+threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id1 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - if((gridDim.x - blockIdx.x - 1)+blockIdx.y == gridDim.x+gridDim.y-k-2) - { - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = threadIdx.y + blockDim.y*blockIdx.y; - - int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; - - for(int l = 2*blockDim.x - 2; l > -1; l--) - { - if(id2 == l) - { - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) - solver->updateValue(gx,gy); - return; - } - __syncthreads(); - } - - } - /*---------------------------------------------------------------------------------------------------------------------------*/ - - - - - - } - - - - - - - - - - - - - - - - - - - - - - - - - - - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} -#endif - - - - - - -//__global__ void runCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int k) -//{ -// -// if(sweep==1 && blockIdx.x+blockIdx.y == k) -// { -// int gx = threadIdx.x + blockDim.x*blockIdx.x; -// int gy = threadIdx.y + blockDim.y*blockIdx.y; -// -// int id1 = threadIdx.x+threadIdx.y; -// -// for(int l = 0; l < 2*blockDim.x - 1; l++) -// { -// if(id1 == l) -// { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) -// solver->updateValue(gx,gy); -// } -// __syncthreads(); -// } -// -// } -// /*---------------------------------------------------------------------------------------------------------------------------*/ -// -// else if(sweep==2 && (gridDim.x - blockIdx.x - 1)+blockIdx.y == k) -// { -// int gx = threadIdx.x + blockDim.x*blockIdx.x; -// int gy = threadIdx.y + blockDim.y*blockIdx.y; -// -// int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; -// -// for(int l = 0; l < 2*blockDim.x - 1; l++) -// { -// if(id2 == l) -// { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) -// solver->updateValue(gx,gy); -// } -// __syncthreads(); -// } -// -// } -// /*---------------------------------------------------------------------------------------------------------------------------*/ -// -// else if(sweep==4 && blockIdx.x+blockIdx.y == gridDim.x+gridDim.y-k-2) -// { -// int gx = threadIdx.x + blockDim.x*blockIdx.x; -// int gy = threadIdx.y + blockDim.y*blockIdx.y; -// -// int id1 = threadIdx.x+threadIdx.y; -// -// for(int l = 2*blockDim.x - 2; l > -1; l--) -// { -// if(id1 == l) -// { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) -// solver->updateValue(gx,gy); -// return; -// } -// __syncthreads(); -// } -// -// } -// /*---------------------------------------------------------------------------------------------------------------------------*/ -// -// else if(sweep==8 && (gridDim.x - blockIdx.x - 1)+blockIdx.y == gridDim.x+gridDim.y-k-2) -// { -// int gx = threadIdx.x + blockDim.x*blockIdx.x; -// int gy = threadIdx.y + blockDim.y*blockIdx.y; -// -// int id2 = (blockDim.x - threadIdx.x - 1) + threadIdx.y; -// -// for(int l = 2*blockDim.x - 2; l > -1; l--) -// { -// if(id2 == l) -// { -// if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy /*&& gy > -1&& gx > -1*/) -// solver->updateValue(gx,gy); -// return; -// } -// __syncthreads(); -// } -// -// } -// /*---------------------------------------------------------------------------------------------------------------------------*/ -// -// -// -// -// -//} - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v4_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v4_impl.h deleted file mode 100644 index e0a9697c2e5ea4097232b4d4a8f3c6da6fa41e50..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v4_impl.h +++ /dev/null @@ -1,1003 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_CUDA_v4_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - -__device__ -double fabsMin( double x, double y) -{ - double fx = abs(x); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; -} - -__device__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(__longlong_as_double(assumed),val) )); - } while (assumed != old); - return __longlong_as_double(old); -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlFastSweeping() -:dofVector(Mesh) -{ -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - //Entity.refresh(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1); - - - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(1, 1024); - dim3 numBlocks(4,1); - - - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,0,0); - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - //data.setLike(dofVector.getData()); - //cudaMemcpy(data.getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaMemcpy(dofVector.getData().getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - //data.save("u-00001.tnl"); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - Real value = cudaDofVector2[Entity.getIndex()]; - Real a,b, tmp; - - if( i == 0 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - -// cudaDofVector2[Entity.getIndex()] = fabsMin(value, tmp); - atomicFabsMin(&(cudaDofVector2[Entity.getIndex()]), tmp); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int i = threadIdx.x + blockDim.x*blockIdx.x; - int j = blockDim.y*blockIdx.y + threadIdx.y; - - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - int gid = Entity.getIndex(); - - cudaDofVector2[gid] = INT_MAX*sign(cudaDofVector[gid]); -// -// if(abs(cudaDofVector[gid]) < 1.01*h) -// cudaDofVector2[gid] = cudaDofVector[gid]; - - - - - - if(i+1 < Mesh.getDimensions().x() && j+1 < Mesh.getDimensions().y() && !exactInput) - { - if(cudaDofVector[Entity.getIndex()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1111(i,j); - else - setupSquare1110(i,j); - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1101(i,j); - else - setupSquare1100(i,j); - } - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1011(i,j); - else - setupSquare1010(i,j); - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1001(i,j); - else - setupSquare1000(i,j); - } - } - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0111(i,j); - else - setupSquare0110(i,j); - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0101(i,j); - else - setupSquare0100(i,j); - } - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0011(i,j); - else - setupSquare0010(i,j); - } - else - { - if(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0001(i,j); - else - setupSquare0000(i,j); - } - } - } - - } - if(exactInput) - { - if(abs(cudaDofVector[gid]) < 1.5*h) - cudaDofVector2[gid] = cudaDofVector[gid]; - } - - - return true; - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - //Real fy = abs(y); - - //Real tmpMin = Min(fx,abs(y)); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - int gx = 0; - int gy = threadIdx.y; - //if(solver->Mesh.getDimensions().x() <= gx || solver->Mesh.getDimensions().y() <= gy) - // return; - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - //int gid = solver->Mesh.getDimensions().x() * gy + gx; - //int max = solver->Mesh.getDimensions().x()*solver->Mesh.getDimensions().x(); - - //int id1 = gx+gy; - //int id2 = (solver->Mesh.getDimensions().x() - gx - 1) + gy; - - if(blockIdx.x==0) - { - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==1) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==2) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - else if(blockIdx.x==3) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - - - - - -} - - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - - - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ -// tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); -// Entity.setCoordinates(CoordinatesType(i,j)); -// Entity.refresh(); -// tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); -// cudaDofVector2[Entity.getIndex()]=fabsMin(INT_MAX,cudaDofVector2[Entity.getIndex()]); -// cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ -// tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); -// Entity.setCoordinates(CoordinatesType(i,j)); -// Entity.refresh(); -// tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); -// cudaDofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,cudaDofVector2[Entity.getIndex()]); -// cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=INT_MAX; //fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-0.5*h; //fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=0.5*h; //fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=0.5*h; //fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=0.5*h; //fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=INT_MAX; //fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=0.5*h; //fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=INT_MAX; //fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-0.5*h; //fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=-0.5*h; //fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=INT_MAX; //fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=0.5*h; //fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=-INT_MAX; //fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=-0.5*h; //fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=0.5*h; //fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-0.5*h; //fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=-0.5*h; //fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-0.5*h; //fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-INT_MAX; //fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[Entity.getIndex()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=-0.5*h; //fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=INT_MAX; //fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-0.5*h; //fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=0.5*h; //fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=0.5*h; //fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=-0.5*h; //fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-INT_MAX; //fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-0.5*h; //fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=0.5*h; //fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=-0.5*h; //fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-0.5*h; //fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=0.5*h; //fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=0.5*h; //fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-0.5*h; //fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-0.5*h; //fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=0.5*h; //fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=-0.5*h; //fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=0.5*h; //fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-0.5*h; //fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=-0.5*h; //fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=0.5*h; //fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=-0.5*h; //fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Real al,be, a,b,c,s; - al=abs(cudaDofVector[Entity.getIndex()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - cudaDofVector[Entity.getIndex()])); - - be=abs(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b = 1.0; - c = -be; - s = h/sqrt(a*a+b*b); - - - cudaDofVector2[Entity.getIndex()]=-0.5*h; //fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=-0.5*h; //fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=0.5*h; //fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=0.5*h; //fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - tnlGridEntity< tnlGrid< 2,double, TNL::Devices::Host, int >, 2, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - cudaDofVector2[Entity.getIndex()]=-0.5*h; //fabsMin(cudaDofVector[Entity.getIndex()],cudaDofVector2[Entity.getIndex()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=0.5*h; //fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 0, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=-0.5*h; //fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 1 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=0.5*h; //fabsMin(cudaDofVector[neighborEntities.template getEntityIndex< 1, 0 >()],cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} -#endif - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v5_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v5_impl.h deleted file mode 100644 index 1591bb6137007b88e636a83bb113030ecd529f9c..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_CUDA_v5_impl.h +++ /dev/null @@ -1,697 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_CUDA_v5_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - -__device__ -double fabsMin( double x, double y) -{ - double fx = abs(x); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; -} - -__device__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(assumed,val) )); - } while (assumed != old); - return __longlong_as_double(old); -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.getSpaceSteps().x(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData(), this->dofVector.getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(16, 16); - dim3 numBlocks(n/16 + 1 ,n/16 +1); - - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ -// -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = 0; j < Mesh.getDimensions().y(); j++) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// for(Index i = 0; i < Mesh.getDimensions().x(); i++) -// { -// for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) -// { -// updateValue(i,j); -// } -// } -// -///*---------------------------------------------------------------------------------------------------------------------------*/ -// -// -// dofVector.save("u-00001.tnl"); - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(1, 512); - dim3 numBlocks(4,1); - - - runCUDA<<<numBlocks,threadsPerBlock,3*(512+1)*sizeof(double)>>>(this->cudaSolver,0,0); - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(this->dofVector.getData(), cudaDofVector, this->dofVector.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - Index index = Mesh.getCellIndex(CoordinatesType(i,j)); - Real value = cudaDofVector[index]; - Real a,b, tmp; - - if( i == 0 ) - a = cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)]; - else - { - a = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<-1,0>(index)], - cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)] ); - } - - if( j == 0 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)]; - else - { - b = fabsMin( cudaDofVector[Mesh.template getCellNextToCell<0,-1>(index)], - cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - cudaDofVector[index] = fabsMin(value, tmp); - -} - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, double** sharedMem, int k3) -{ - Index index = Mesh.getCellIndex(CoordinatesType(i,j)); - Real value = sharedMem[k3+1][threadIdx.y]; - Real a,b, tmp; - - if( i == 0 ) - a = sharedMem[k3][threadIdx.y]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = sharedMem[k3+2][threadIdx.y]; - else - { - a = fabsMin( sharedMem[k3][threadIdx.y], - sharedMem[k3+2][threadIdx.y] ); - } - - if( j == 0 ) - b = sharedMem[k3][threadIdx.y+1]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = sharedMem[k3+2][threadIdx.y-1]; - else - { - b = fabsMin( sharedMem[k3][threadIdx.y+1], - sharedMem[k3+2][threadIdx.y-1] ); - } - - - if(abs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - -// sharedMem[k3+1][threadIdx.y] = this->fabsMin(value, tmp); -// atomicFabsMin(&(cudaDofVector[index]), tmp); - cudaDofVector[index] = tmp; - this->fabsMin(value, tmp); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - int gid = Mesh.getCellIndex(CoordinatesType(gx,gy)); - - int total = blockDim.x*gridDim.x; - - - - Real tmp = 0.0; - int flag = 0; - counter = 0; - tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - - - if(!exactInput) - { - cudaDofVector[gid]=cudaDofVector[gid]=0.5*h*sign(cudaDofVector[gid]); - } - __threadfence(); -// printf("-----------------------------------------------------------------------------------\n"); - - __threadfence(); - - if(gx > 0 && gx < Mesh.getDimensions().x()-1) - { - if(gy > 0 && gy < Mesh.getDimensions().y()-1) - { - - Index j = gy; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag=1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - } - -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); -// printf("****************************************************************\n"); -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == 0) - { -// printf("gx: %d, gy: %d, gid: %d \n", gx, gy,gid); - Index j = 0; - Index i = gx; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); - if(gx > 0 && gx < Mesh.getDimensions().x()-1 && gy == Mesh.getDimensions().y() - 1) - { - Index i = gx; - Index j = Mesh.getDimensions().y() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == 0) - { - Index j = gy; - Index i = 0; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } -// printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - if(gy > 0 && gy < Mesh.getDimensions().y()-1 && gx == Mesh.getDimensions().x() - 1) - { - Index j = gy; - Index i = Mesh.getDimensions().x() - 1; -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - -// printf("##################################################################################################\n"); - if(gx == Mesh.getDimensions().x() - 1 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == Mesh.getDimensions().x() - 1 && - gy == 0) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx-1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } -// printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); - if(gx == 0 && - gy == Mesh.getDimensions().y() - 1) - { - -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy-1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - if(gx == 0 && - gy == 0) - { -// tmp = sign(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))]); - if(cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx+1,gy))]*tmp > 0.0 && - cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy+1))]*tmp > 0.0) - - flag = 1;//cudaDofVector[Mesh.getCellIndex(CoordinatesType(gx,gy))] = tmp*INT_MAX; - } - - __threadfence(); - - if(flag==1) - cudaDofVector[gid] = tmp*3; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - //Real fy = abs(y); - - //Real tmpMin = Min(fx,abs(y)); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - extern __shared__ double u[]; - double* sharedMem[5]; - sharedMem[0] = u; - sharedMem[1] = &(u[blockDim.y+1]); - sharedMem[2] = &(sharedMem[1][blockDim.y+1]); - sharedMem[3] = sharedMem[1]; - sharedMem[4] = sharedMem[2]; - - int gx = 0; - int gy = threadIdx.y; - //if(solver->Mesh.getDimensions().x() <= gx || solver->Mesh.getDimensions().y() <= gy) - // return; - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - //int gid = solver->Mesh.getDimensions().x() * gy + gx; - //int max = solver->Mesh.getDimensions().x()*solver->Mesh.getDimensions().x(); - - //int id1 = gx+gy; - //int id2 = (solver->Mesh.getDimensions().x() - gx - 1) + gy; - - - if(blockIdx.x==0) - { - if(threadIdx.y==0) - sharedMem[1][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(0,0))]; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - int k3=k%3; - - if(threadIdx.y==0) - { - if(gx==n-1) - sharedMem[k3][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(0,gy+blockDim.y))]; - else - sharedMem[k3][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx+1,gy))]; - } -// else -// solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy-1))]=sharedMem[k3+2][threadIdx.y-1]; - - if(gy<n-1) - sharedMem[k3][threadIdx.y+1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy+1))]; - - solver->updateValue(gx,gy,sharedMem,k3); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } -// else if(blockIdx.x==1) -// { -// gx=n-1; -// gy=threadIdx.y; -// -// if(threadIdx.y==0) -// sharedMem[1][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(n-1,0))]; -// -// for(int k = 0; k < n*blockCount + blockDim.y; k++) -// { -// if(threadIdx.y < k+1 && gy < n) -// { -// int k3=k%3; -// -// if(threadIdx.y==0) -// if(gx==0) -// sharedMem[k3+2][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(n-1,gy+blockDim.y))]; -// else -// sharedMem[k3+2][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx-1,gy))]; -// else -// solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy-1))]=sharedMem[k3][threadIdx.y-1]; -// -// if(gy<n-1) -// sharedMem[k3+2][threadIdx.y+1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy+1))]; -// -// -// solver->updateValue(gx,gy,sharedMem,k3); -// gx--; -// if(gx==-1) -// { -// gx=n-1; -// gy+=blockDim.y; -// } -// } -// -// -// __syncthreads(); -// } -// } -// else if(blockIdx.x==2) -// { -// gx=0; -// gy=n-blockDim.y-1+threadIdx.y; -// -// if(threadIdx.y==0) -// sharedMem[1][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(0,n-1))]; -// -// for(int k = 0; k < n*blockCount + blockDim.y; k++) -// { -// if(blockDim.y-threadIdx.y < k+1 && gy > -1) -// { -// int k3=k%3; -// -// if(threadIdx.y==blockDim.y-1) -// if(gx==n-1) -// sharedMem[k3][n-1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(0,gy-blockDim.y))]; -// else -// sharedMem[k3][n-1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx+1,gy))]; -// else -// solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy-1))]=sharedMem[k3+2][threadIdx.y-1]; -// -// if(gy<n-1) -// sharedMem[k3][threadIdx.y+1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy+1))]; -// -// -// solver->updateValue(gx,gy,sharedMem,k3); -// gx++; -// if(gx==n) -// { -// gx=0; -// gy-=blockDim.y; -// } -// } -// -// -// __syncthreads(); -// } -// } -// else if(blockIdx.x==3) -// { -// gx=n-1; -// gy=n-blockDim.y-1+threadIdx.y; -// -// if(threadIdx.y==0) -// sharedMem[1][0]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(n-1,n-1))]; -// -// -// for(int k = 0; k < n*blockCount + blockDim.y; k++) -// { -// if(blockDim.y-threadIdx.y < k+1 && gy > -1) -// { -// int k3=k%3; -// -// if(threadIdx.y==blockDim.y-1) -// if(gx==n-1) -// sharedMem[k3+2][n-1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(n-1,gy-blockDim.y))]; -// else -// sharedMem[k3+2][n-1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx+1,gy))]; -// else -// solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy-1))]=sharedMem[k3][threadIdx.y-1]; -// -// if(gy<n-1) -// sharedMem[k3+2][threadIdx.y+1]=solver->cudaDofVector[solver->Mesh.getCellIndex(Containers::StaticVector<2,int>(gx,gy+1))]; -// -// -// solver->updateValue(gx,gy,sharedMem,k3); -// gx--; -// if(gx==-1) -// { -// gx=n-1; -// gy-=blockDim.y; -// } -// } -// -// -// __syncthreads(); -// } -// } - - - - -} - - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver) -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy) - { - solver->initGrid(); - } - - -} -#endif - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_impl.h deleted file mode 100644 index c4ce8fe6b2ee80131c0bc2a945bc8cef4377f106..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_impl.h +++ /dev/null @@ -1,927 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: tnlFastSweeping() -:Entity(Mesh), - dofVector(Mesh), - dofVector2(Mesh) -{ -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - dofVector2.load(initialCondition); - - h = Mesh.template getSpaceStepsProducts< 1, 0 >(); - Entity.refresh(); - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - cout << "a" <<std::endl; - return initGrid(); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - for(int i=0; i< Mesh.getDimensions().x()*Mesh.getDimensions().x();i++) - { - dofVector2[i]=INT_MAX*sign(dofVector[i]); - } - - for(int i = 0 ; i < Mesh.getDimensions().x()-1; i++) - { - for(int j = 0 ; j < Mesh.getDimensions().x()-1; j++) - { - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - neighborEntities.refresh(Mesh,Entity.getIndex()); - - if(dofVector[this->Entity.getIndex()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1111(i,j); - else - setupSquare1110(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1101(i,j); - else - setupSquare1100(i,j); - } - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1011(i,j); - else - setupSquare1010(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare1001(i,j); - else - setupSquare1000(i,j); - } - } - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0111(i,j); - else - setupSquare0110(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0101(i,j); - else - setupSquare0100(i,j); - } - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()] > 0) - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0011(i,j); - else - setupSquare0010(i,j); - } - else - { - if(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()] > 0) - setupSquare0001(i,j); - else - setupSquare0000(i,j); - } - } - } - - } - } - cout << "a" <<std::endl; - -// Real tmp = 0.0; -// Real ax=0.5/sqrt(2.0); -// -// if(!exactInput) -// { -// for(Index i = 0; i < Mesh.getDimensions().x()*Mesh.getDimensions().y(); i++) -// dofVector[i]=0.5*h*sign(dofVector[i]); -// } -// -// -// for(Index i = 1; i < Mesh.getDimensions().x()-1; i++) -// { -// for(Index j = 1; j < Mesh.getDimensions().y()-1; j++) -// { -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// } -// -// -// -// for(int i = 1; i < Mesh.getDimensions().x()-1; i++) -// { -// Index j = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// for(int i = 1; i < Mesh.getDimensions().x()-1; i++) -// { -// Index j = Mesh.getDimensions().y() - 1; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// for(int j = 1; j < Mesh.getDimensions().y()-1; j++) -// { -// Index i = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// for(int j = 1; j < Mesh.getDimensions().y()-1; j++) -// { -// Index i = Mesh.getDimensions().x() - 1; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// -// -// if(tmp == 0.0) -// {} -// else if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) -// {} -// else -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// } -// -// -// Index i = Mesh.getDimensions().x() - 1; -// Index j = Mesh.getDimensions().y() - 1; -// -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// -// -// -// j = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// -// -// -// i = 0; -// j = Mesh.getDimensions().y() -1; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; -// -// -// -// j = 0; -// tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); -// if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp > 0.0 && -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp > 0.0) -// -// dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - - //data.setLike(dofVector2.getData()); - //data=dofVector2.getData(); - //cout << data.getType() <<std::endl; - dofVector2.save("u-00000.tnl"); - //dofVector2.getData().save("u-00000.tnl"); - - return true; -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - -// data.setLike(dofVector2.getData()); -// data = dofVector2.getData(); -// cout << data.getType() <<std::endl; - dofVector2.save("u-00001.tnl"); - //dofVector2.getData().save("u-00001.tnl"); - - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j) -{ - - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - Real value = dofVector2[Entity.getIndex()]; - Real a,b, tmp; - - if( i == 0 ) - a = dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = dofVector2[neighborEntities.template getEntityIndex< -1, 0 >()]; - else - { - a = fabsMin( dofVector2[neighborEntities.template getEntityIndex< -1, 0 >()], - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()] ); - } - - if( j == 0 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, -1 >()]; - else - { - b = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, -1 >()], - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()] ); - } - - - if(fabs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - - - dofVector2[Entity.getIndex()] = fabsMin(value, tmp); - -// if(dofVector2[Entity.getIndex()] > 1.0) -// cout << value << " " << tmp << " " << dofVector2[Entity.getIndex()] <<std::endl; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = fabs(x); - Real fy = fabs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -{ -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// auto neighborEntities = Entity.getNeighborEntities(); -// dofVector2[Entity.getIndex()]=fabsMin(INT_MAX,dofVector2[Entity.getIndex()]); -// dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -{ -// this->Entity.setCoordinates(CoordinatesType(i,j)); -// this->Entity.refresh(); -// auto neighborEntities = Entity.getNeighborEntities(); -// dofVector2[Entity.getIndex()]=fabsMin(-INT_MAX,dofVector2[(Entity.getIndex())]); -// dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); -// dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-INT_MAX,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[Entity.getIndex()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - a = be/al; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(-abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - dofVector2[Entity.getIndex()]=fabsMin(dofVector[Entity.getIndex()],dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 1, 0 >()])); - - a = al-be; - b=1.0; - c=-al; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - Real al,be, a,b,c,s; - al=abs(dofVector[Entity.getIndex()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 0 >()]- - dofVector[Entity.getIndex()])); - - be=abs(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()]/ - (dofVector[neighborEntities.template getEntityIndex< 1, 1 >()]- - dofVector[neighborEntities.template getEntityIndex< 0, 1 >()])); - - a = al-be; - b=1.0; - c=-be; - s= h/sqrt(a*a+b*b); - - - dofVector2[Entity.getIndex()]=fabsMin(-abs(a*0+b*0+c)*s,dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(-abs(a*1+b*0+c)*s,dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(abs(a*1+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(abs(a*0+b*1+c)*s,dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); - -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -{ - this->Entity.setCoordinates(CoordinatesType(i,j)); - this->Entity.refresh(); - auto neighborEntities = Entity.getNeighborEntities(); - dofVector2[Entity.getIndex()]=fabsMin(dofVector[Entity.getIndex()],dofVector2[(Entity.getIndex())]); - dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 0, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 0, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 1 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 1 >()]); - dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]=fabsMin(dofVector[neighborEntities.template getEntityIndex< 1, 0 >()],dofVector2[neighborEntities.template getEntityIndex< 1, 0 >()]); -} - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_openMP_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_openMP_impl.h deleted file mode 100644 index 54bbe931e0ae305ac300027d7da850d705b4c309..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping2D_openMP_impl.h +++ /dev/null @@ -1,399 +0,0 @@ -/*************************************************************************** - tnlFastSweeping_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING2D_IMPL_H_ -#define TNLFASTSWEEPING2D_IMPL_H_ - -#include "tnlFastSweeping.h" - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - h = Mesh.getSpaceSteps().x(); - - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - -#ifdef HAVE_OPENMP -// gridLock = (omp_lock_t*) malloc(sizeof(omp_lock_t)*Mesh.getDimensions().x()*Mesh.getDimensions().y()); -// -// for(int i = 0; i < Mesh.getDimensions().x()*Mesh.getDimensions().y(); i++) -// omp_init_lock(&gridLock[i]); -#endif - - return initGrid(); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - - Real tmp = 0.0; - - if(!exactInput) - { - for(Index i = 0; i < Mesh.getDimensions().x()*Mesh.getDimensions().y(); i++) - dofVector[i]=0.5*h*sign(dofVector[i]); - } - - - for(Index i = 1; i < Mesh.getDimensions().x()-1; i++) - { - for(Index j = 1; j < Mesh.getDimensions().y()-1; j++) - { - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - } - - - - for(int i = 1; i < Mesh.getDimensions().x()-1; i++) - { - Index j = 0; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 ) - {} - else - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - - for(int i = 1; i < Mesh.getDimensions().x()-1; i++) - { - Index j = Mesh.getDimensions().y() - 1; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - - for(int j = 1; j < Mesh.getDimensions().y()-1; j++) - { - Index i = 0; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - - for(int j = 1; j < Mesh.getDimensions().y()-1; j++) - { - Index i = Mesh.getDimensions().x() - 1; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - - - if(tmp == 0.0) - {} - else if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp < 0.0 || - dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp < 0.0 ) - {} - else - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - } - - - Index i = Mesh.getDimensions().x() - 1; - Index j = Mesh.getDimensions().y() - 1; - - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp > 0.0 && - dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp > 0.0) - - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - - - - j = 0; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - if(dofVector[Mesh.getCellIndex(CoordinatesType(i-1,j))]*tmp > 0.0 && - dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp > 0.0) - - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - - - - i = 0; - j = Mesh.getDimensions().y() -1; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp > 0.0 && - dofVector[Mesh.getCellIndex(CoordinatesType(i,j-1))]*tmp > 0.0) - - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - - - - j = 0; - tmp = sign(dofVector[Mesh.getCellIndex(CoordinatesType(i,j))]); - if(dofVector[Mesh.getCellIndex(CoordinatesType(i+1,j))]*tmp > 0.0 && - dofVector[Mesh.getCellIndex(CoordinatesType(i,j+1))]*tmp > 0.0) - - dofVector[Mesh.getCellIndex(CoordinatesType(i,j))] = tmp*INT_MAX; - - - dofVector.save("u-00000.tnl"); - - return true; -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - DofVectorType d2,d3,d4; - d2.setLike(dofVector); - d2=dofVector; - d3.setLike(dofVector); - d3=dofVector; - d4.setLike(dofVector); - d4=dofVector; - - -#ifdef HAVE_OPENMP -#pragma omp parallel sections num_threads(4) - { - { -#endif - - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,&dofVector); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ -#ifdef HAVE_OPENMP - } -#pragma omp section - { -#endif - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,&d2); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ -#ifdef HAVE_OPENMP - } -#pragma omp section - { -#endif - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j, &d3); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ -#ifdef HAVE_OPENMP - } -#pragma omp section - { -#endif - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j, &d4); - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ -#ifdef HAVE_OPENMP - } - } -#endif - - -#ifdef HAVE_OPENMP -#pragma omp parallel for num_threads(4) schedule(dynamic) -#endif - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - int index = Mesh.getCellIndex(CoordinatesType(i,j)); - dofVector[index] = fabsMin(dofVector[index], d2[index]); - dofVector[index] = fabsMin(dofVector[index], d3[index]); - dofVector[index] = fabsMin(dofVector[index], d4[index]); - } - } - - dofVector.save("u-00001.tnl"); - - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, DofVectorType* grid) -{ - Index index = Mesh.getCellIndex(CoordinatesType(i,j)); - Real value = (*grid)[index]; - Real a,b, tmp; - - if( i == 0 ) - a = (*grid)[Mesh.template getCellNextToCell<1,0>(index)]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = (*grid)[Mesh.template getCellNextToCell<-1,0>(index)]; - else - { - a = fabsMin( (*grid)[Mesh.template getCellNextToCell<-1,0>(index)], - (*grid)[Mesh.template getCellNextToCell<1,0>(index)] ); - } - - if( j == 0 ) - b = (*grid)[Mesh.template getCellNextToCell<0,1>(index)]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = (*grid)[Mesh.template getCellNextToCell<0,-1>(index)]; - else - { - b = fabsMin( (*grid)[Mesh.template getCellNextToCell<0,-1>(index)], - (*grid)[Mesh.template getCellNextToCell<0,1>(index)] ); - } - - - if(fabs(a-b) >= h) - tmp = fabsMin(a,b) + sign(value)*h; - else - tmp = 0.5 * (a + b + sign(value)*sqrt(2.0 * h * h - (a - b) * (a - b) ) ); - -#ifdef HAVE_OPENMP -// omp_set_lock(&gridLock[index]); -#endif - (*grid)[index] = fabsMin(value, tmp); -#ifdef HAVE_OPENMP -// omp_unset_lock(&gridLock[index]); -#endif -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -Real tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = fabs(x); - Real fy = fabs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - - -} - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping3D_CUDA_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping3D_CUDA_impl.h deleted file mode 100644 index 6a5195cfe4edda5754b8826158d6d9faa5701fa0..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping3D_CUDA_impl.h +++ /dev/null @@ -1,961 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_CUDA_v4_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING3D_IMPL_H_ -#define TNLFASTSWEEPING3D_IMPL_H_ - -#include "tnlFastSweeping.h" - -//__device__ -//double fabsMin( double x, double y) -//{ -// double fx = abs(x); -// -// if(Min(fx,abs(y)) == fx) -// return x; -// else -// return y; -//} -// -//__device__ -//double atomicFabsMin(double* address, double val) -//{ -// unsigned long long int* address_as_ull = -// (unsigned long long int*)address; -// unsigned long long int old = *address_as_ull, assumed; -// do { -// assumed = old; -// old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(assumed,val) )); -// } while (assumed != old); -// return __longlong_as_double(old); -//} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - - this->h = Mesh.template getSpaceStepsProducts< 1, 0, 0 >(); - counter = 0; - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; - - -#ifdef HAVE_CUDA - - cudaMalloc(&(cudaDofVector), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - cudaMalloc(&(cudaDofVector2), this->dofVector.getData().getSize()*sizeof(double)); - cudaMemcpy(cudaDofVector2, this->dofVector.getData().getData(), this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyHostToDevice); - - - cudaMalloc(&(this->cudaSolver), sizeof(tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >), cudaMemcpyHostToDevice); - -#endif - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(8, 8,8); - dim3 numBlocks(n/8 + 1, n/8 +1, n/8 +1); - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - return true; -} - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - int n = Mesh.getDimensions().x(); - dim3 threadsPerBlock(1, 1024); - dim3 numBlocks(8,1); - - - runCUDA<<<numBlocks,threadsPerBlock>>>(this->cudaSolver,0,0); - - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - cudaMemcpy(this->dofVector.getData().getData(), cudaDofVector2, this->dofVector.getData().getSize()*sizeof(double), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - cudaFree(cudaDofVector); - cudaFree(cudaDofVector2); - cudaFree(cudaSolver); - dofVector.save("u-00001.tnl"); - cudaDeviceSynchronize(); - return true; -} - - - - -#ifdef HAVE_CUDA - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, Index k) -{ - tnlGridEntity< tnlGrid< 3,double, TNL::Devices::Host, int >, 3, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j,k)); - Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage >,3> neighborEntities(Entity); - Real value = cudaDofVector2[Entity.getIndex()]; - Real a,b,c, tmp; - - if( i == 0 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0, 0 >()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0, 0 >()]; - else - { - a = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< -1, 0, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 1, 0, 0 >()] ); - } - - if( j == 0 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1, 0 >()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1, 0 >()]; - else - { - b = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, -1, 0 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 1, 0 >()] ); - } - - if( k == 0 ) - c = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, 1 >()]; - else if( k == Mesh.getDimensions().z() - 1 ) - c = cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, -1 >()]; - else - { - c = fabsMin( cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, -1 >()], - cudaDofVector2[neighborEntities.template getEntityIndex< 0, 0, 1 >()] ); - } - - Real hD = 3.0*h*h - 2.0*(a*a + b*b + c*c - a*b - a*c - b*c); - - if(hD < 0.0) - tmp = fabsMin(a,fabsMin(b,c)) + sign(value)*h; - else - tmp = (1.0/3.0) * ( a + b + c + sign(value)*sqrt(hD) ); - - atomicFabsMin(&cudaDofVector2[Entity.getIndex()],tmp); - -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -bool tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid(int i, int j, int k) -{ - tnlGridEntity< tnlGrid< 3,double, TNL::Devices::Host, int >, 3, tnlGridEntityNoStencilStorage > Entity(Mesh); - Entity.setCoordinates(CoordinatesType(i,j,k)); - Entity.refresh(); - int gid = Entity.getIndex(); - - if(abs(cudaDofVector[gid]) < 1.0*h) - cudaDofVector2[gid] = 0.5*h;//cudaDofVector[gid]; - else - cudaDofVector2[gid] = INT_MAX*sign(cudaDofVector[gid]); - - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -__device__ -Real tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = abs(x); - if(Min(fx,abs(y)) == fx) - return x; - else - return y; - - -} - - - -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i) -{ - - int gx = 0; - int gy = threadIdx.y; - - int n = solver->Mesh.getDimensions().x(); - int blockCount = n/blockDim.y +1; - - if(blockIdx.x==0) - { - for(int gz = 0; gz < n;gz++) - { - gx = 0; - gy = threadIdx.y; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - __syncthreads(); - } - } - else if(blockIdx.x==1) - { - for(int gz = 0; gz < n;gz++) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==2) - { - - for(int gz = 0; gz < n;gz++) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==3) - { - for(int gz = 0; gz < n;gz++) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - - - - - else if(blockIdx.x==4) - { - for(int gz = n-1; gz > -1;gz--) - { - gx = 0; - gy = threadIdx.y; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==5) - { - for(int gz = n-1; gz > -1;gz--) - { - gx=n-1; - gy=threadIdx.y; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy < n) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy+=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==6) - { - - for(int gz = n-1; gz > -1;gz--) - { - gx=0; - gy=n-threadIdx.y-1; - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx++; - if(gx==n) - { - gx=0; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - else if(blockIdx.x==7) - { - for(int gz = n-1; gz > -1;gz--) - { - gx=n-1; - gy=n-threadIdx.y-1; - - for(int k = 0; k < n*blockCount + blockDim.y; k++) - { - if(threadIdx.y < k+1 && gy > -1) - { - solver->updateValue(gx,gy,gz); - gx--; - if(gx==-1) - { - gx=n-1; - gy-=blockDim.y; - } - } - - - __syncthreads(); - } - } - } - - - - -} - - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver) -{ - int gx = threadIdx.x + blockDim.x*blockIdx.x; - int gy = blockDim.y*blockIdx.y + threadIdx.y; - int gz = blockDim.z*blockIdx.z + threadIdx.z; - - if(solver->Mesh.getDimensions().x() > gx && solver->Mesh.getDimensions().y() > gy && solver->Mesh.getDimensions().z() > gz) - { - solver->initGrid(gx,gy,gz); - } - - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1111( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(INT_MAX,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0000( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(-INT_MAX,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-INT_MAX,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1110( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1101( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1011( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0111( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0001( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0010( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0100( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1000( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// a = be/al; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -// -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1100( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = al-be; -// b=1.0; -// c=-al; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1010( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = al-be; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(-abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare1001( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(cudaDofVector[index],cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -// -// -// -// -// -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0011( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)])); -// -// a = al-be; -// b=1.0; -// c=-al; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0101( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// Real al,be, a,b,c,s; -// al=abs(cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,0>(index)])); -// -// be=abs(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)]/ -// (cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)]- -// cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)])); -// -// a = al-be; -// b=1.0; -// c=-be; -// s= h/sqrt(a*a+b*b); -// -// -// cudaDofVector2[index]=fabsMin(-abs(a*0+b*0+c)*s,cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(-abs(a*1+b*0+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(abs(a*1+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(abs(a*0+b*1+c)*s,cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -// -//} -// -//template< typename MeshReal, -// typename Device, -// typename MeshIndex, -// typename Real, -// typename Index > -//void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: setupSquare0110( Index i, Index j) -//{ -// Index index = Mesh.getCellIndex(CoordinatesType(i,j)); -// cudaDofVector2[index]=fabsMin(cudaDofVector[index],cudaDofVector2[(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<0,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<0,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,1>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,1>(index)]); -// cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]=fabsMin(cudaDofVector[Mesh.template getCellNextToCell<1,0>(index)],cudaDofVector2[Mesh.template getCellNextToCell<1,0>(index)]); -//} -#endif - - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping3D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping3D_impl.h deleted file mode 100644 index e22de0ab85f3814004b072ef0ebdb403b7f970c7..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping3D_impl.h +++ /dev/null @@ -1,307 +0,0 @@ -/*************************************************************************** - tnlFastSweeping2D_impl.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING3D_IMPL_H_ -#define TNLFASTSWEEPING3D_IMPL_H_ - -#include "tnlFastSweeping.h" - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -String tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: getType() -{ - return String( "tnlFastSweeping< " ) + - MeshType::getType() + ", " + - ::getType< Real >() + ", " + - ::getType< Index >() + " >"; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: tnlFastSweeping() -:Entity(Mesh), - dofVector(Mesh), - dofVector2(Mesh) -{ -} - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: init( const Config::ParameterContainer& parameters ) -{ - const String& meshFile = parameters.getParameter< String >( "mesh" ); - - if( ! Mesh.load( meshFile ) ) - { - std::cerr << "I am not able to load the mesh from the file " << meshFile << "." <<std::endl; - return false; - } - - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - if( ! dofVector.load( initialCondition ) ) - { - std::cerr << "I am not able to load the initial condition from the file " << meshFile << "." <<std::endl; - return false; - } - dofVector2.load(initialCondition); - - h = Mesh.template getSpaceStepsProducts< 1, 0, 0 >(); - Entity.refresh(); - - const String& exact_input = parameters.getParameter< String >( "exact-input" ); - - if(exact_input == "no") - exactInput=false; - else - exactInput=true; -// cout << "bla "<<endl; - return initGrid(); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: initGrid() -{ - for(int i=0; i< Mesh.getDimensions().x()*Mesh.getDimensions().y()*Mesh.getDimensions().z();i++) - { - - if (abs(dofVector[i]) < 1.8*h) - dofVector2[i]=dofVector[i]; - else - dofVector2[i]=INT_MAX*sign(dofVector[i]); - } - - return true; -} - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -bool tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: run() -{ - - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index k = 0; k < Mesh.getDimensions().z(); k++) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - - - - - - - - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = 0; j < Mesh.getDimensions().y(); j++) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = Mesh.getDimensions().x() - 1; i > -1; i--) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - for(Index k = Mesh.getDimensions().z() -1; k > -1; k--) - { - for(Index i = 0; i < Mesh.getDimensions().x(); i++) - { - for(Index j = Mesh.getDimensions().y() - 1; j > -1; j--) - { - updateValue(i,j,k); - } - } - } - -/*---------------------------------------------------------------------------------------------------------------------------*/ - - - dofVector2.save("u-00001.tnl"); - - cout << "bla 3"<<endl; - return true; -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -void tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: updateValue( Index i, Index j, Index k) -{ - this->Entity.setCoordinates(CoordinatesType(i,j,k)); - this->Entity.refresh(); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage >,3> neighborEntities(Entity); - Real value = dofVector2[Entity.getIndex()]; - Real a,b,c, tmp; - - if( i == 0 ) - a = dofVector2[neighborEntities.template getEntityIndex< 1, 0, 0>()]; - else if( i == Mesh.getDimensions().x() - 1 ) - a = dofVector2[neighborEntities.template getEntityIndex< -1, 0, 0 >()]; - else - { - a = fabsMin( dofVector2[neighborEntities.template getEntityIndex< -1, 0, 0>()], - dofVector2[neighborEntities.template getEntityIndex< 1, 0, 0>()] ); - } - - if( j == 0 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, 1, 0>()]; - else if( j == Mesh.getDimensions().y() - 1 ) - b = dofVector2[neighborEntities.template getEntityIndex< 0, -1, 0>()]; - else - { - b = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, -1, 0>()], - dofVector2[neighborEntities.template getEntityIndex< 0, 1, 0>()] ); - } - - if( k == 0 ) - c = dofVector2[neighborEntities.template getEntityIndex< 0, 0, 1>()]; - else if( k == Mesh.getDimensions().z() - 1 ) - c = dofVector2[neighborEntities.template getEntityIndex< 0, 0, -1>()]; - else - { - c = fabsMin( dofVector2[neighborEntities.template getEntityIndex< 0, 0, -1>()], - dofVector2[neighborEntities.template getEntityIndex< 0, 0, 1>()] ); - } - - Real hD = 3.0*h*h - 2.0*(a*a+b*b+c*c-a*b-a*c-b*c); - - if(hD < 0.0) - tmp = fabsMin(a,fabsMin(b,c)) + sign(value)*h; - else - tmp = (1.0/3.0) * ( a + b + c + sign(value)*sqrt(hD) ); - - - dofVector2[Entity.getIndex()] = fabsMin(value, tmp); -} - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -Real tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > :: fabsMin( Real x, Real y) -{ - Real fx = fabs(x); - Real fy = fabs(y); - - Real tmpMin = Min(fx,fy); - - if(tmpMin == fx) - return x; - else - return y; - -} - - - -#endif /* TNLFASTSWEEPING_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweepingSolver.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweepingSolver.h deleted file mode 100644 index fc9eb545987dfa14bb17b28f4d104d4c6e6fa2e7..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweepingSolver.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * File: tnlFastSweepingSolver.h - * Author: oberhuber - * - * Created on July 12, 2016, 6:04 PM - */ - -#pragma once - -#include <functions/tnlConstantFunction.h> -#include <problems/tnlPDEProblem.h> - -template< typename Mesh, - typename Communicator, - typename Anisotropy = tnlConstanstFunction< Mesh > > -class tnlFastSweepingSolver : public tnlPDEProblem< Mesh, - Communicator, - typename Mesh::RealType, - typename Mesh::DeviceType, - typename Mesh::IndexType > -{ - public: - - typedef typename DifferentialOperator::RealType RealType; - typedef typename Mesh::DeviceType DeviceType; - typedef typename DifferentialOperator::IndexType IndexType; - - typedef tnlMeshFunction< Mesh > MeshFunctionType; - typedef tnlPDEProblem< Mesh, TimeDependentProblem, RealType, DeviceType, IndexType > BaseType; - - using typename BaseType::MeshType; - using typename BaseType::DofVectorType; - using typename BaseType::MeshDependentDataType; -}; - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping_CUDA.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping_CUDA.h deleted file mode 100644 index f531da431bfec5d16da8ea7deabe6595031a0873..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/fast-sweeping/tnlFastSweeping_CUDA.h +++ /dev/null @@ -1,194 +0,0 @@ -/*************************************************************************** - tnlFastSweeping_CUDA.h - description - ------------------- - begin : Oct 15 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef TNLFASTSWEEPING_H_ -#define TNLFASTSWEEPING_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> - -#include <functions/tnlMeshFunction.h> -#include <limits.h> -#include <core/tnlDevice.h> -#include <ctime> - - - - - -template< typename Mesh, - typename Real, - typename Index > -class tnlFastSweeping -{}; - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 2, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - tnlFastSweeping(); - - __host__ static String getType(); - __host__ bool init( const Config::ParameterContainer& parameters ); - __host__ bool run(); - -#ifdef HAVE_CUDA - __device__ bool initGrid(); - __device__ void updateValue(const Index i, const Index j); - __device__ void updateValue(const Index i, const Index j, double** sharedMem, const int k3); - __device__ Real fabsMin(const Real x, const Real y); - - tnlFastSweeping< tnlGrid< 2,MeshReal, Device, MeshIndex >, Real, Index >* cudaSolver; - double* cudaDofVector; - double* cudaDofVector2; - int counter; - __device__ void setupSquare1000(Index i, Index j); - __device__ void setupSquare1100(Index i, Index j); - __device__ void setupSquare1010(Index i, Index j); - __device__ void setupSquare1001(Index i, Index j); - __device__ void setupSquare1110(Index i, Index j); - __device__ void setupSquare1101(Index i, Index j); - __device__ void setupSquare1011(Index i, Index j); - __device__ void setupSquare1111(Index i, Index j); - __device__ void setupSquare0000(Index i, Index j); - __device__ void setupSquare0100(Index i, Index j); - __device__ void setupSquare0010(Index i, Index j); - __device__ void setupSquare0001(Index i, Index j); - __device__ void setupSquare0110(Index i, Index j); - __device__ void setupSquare0101(Index i, Index j); - __device__ void setupSquare0011(Index i, Index j); - __device__ void setupSquare0111(Index i, Index j); -#endif - - MeshType Mesh; - -protected: - - - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector; - DofVectorType data; - - - RealType h; - - -}; - - - - - - - - - -template< typename MeshReal, - typename Device, - typename MeshIndex, - typename Real, - typename Index > -class tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index > -{ - -public: - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef tnlGrid< 3, Real, Device, Index > MeshType; - typedef TNL::Containers::Vector< RealType, DeviceType, IndexType> DofVectorType; - typedef typename MeshType::CoordinatesType CoordinatesType; - - - - __host__ static String getType(); - __host__ bool init( const Config::ParameterContainer& parameters ); - __host__ bool run(); - -#ifdef HAVE_CUDA - __device__ bool initGrid(int i, int j, int k); - __device__ void updateValue(const Index i, const Index j, const Index k); - __device__ void updateValue(const Index i, const Index j, const Index k, double** sharedMem, const int k3); - __device__ Real fabsMin(const Real x, const Real y); - - tnlFastSweeping< tnlGrid< 3,MeshReal, Device, MeshIndex >, Real, Index >* cudaSolver; - double* cudaDofVector; - double* cudaDofVector2; - int counter; -#endif - - MeshType Mesh; - -protected: - - - - bool exactInput; - - tnlMeshFunction<MeshType> dofVector; - DofVectorType data; - - RealType h; - - -}; - - - - - - - -#ifdef HAVE_CUDA -//template<int sweep_t> -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i); -__global__ void runCUDA(tnlFastSweeping< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver, int sweep, int i); - -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 2,double, TNL::Devices::Host, int >, double, int >* solver); -__global__ void initCUDA(tnlFastSweeping< tnlGrid< 3,double, TNL::Devices::Host, int >, double, int >* solver); -#endif - -/*various implementtions.... choose one*/ -//#include "tnlFastSweeping2D_CUDA_impl.h" -//#include "tnlFastSweeping2D_CUDA_v2_impl.h" -//#include "tnlFastSweeping2D_CUDA_v3_impl.h" -#include "tnlFastSweeping2D_CUDA_v4_impl.h" -//#include "tnlFastSweeping2D_CUDA_v5_impl.h" - - -#include "tnlFastSweeping3D_CUDA_impl.h" - -#endif /* TNLFASTSWEEPING_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/CMakeLists.txt b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/CMakeLists.txt deleted file mode 100644 index 48382df82de6e7e175e47d24fc3ce69e13c217b5..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -set( tnl_hamilton_jacobi_parallel_map_SOURCES -# MainBuildConfig.h -# tnlParallelMapSolver2D_impl.h -# tnlParallelMapSolver.h -# parallelMapConfig.h -# main.cu - main.cpp) - - -IF( BUILD_CUDA ) - CUDA_ADD_EXECUTABLE(hamilton-jacobi-parallel-map main.cu) -ELSE( BUILD_CUDA ) - ADD_EXECUTABLE(hamilton-jacobi-parallel-map main.cpp) -ENDIF( BUILD_CUDA ) -target_link_libraries (hamilton-jacobi-parallel-map tnl ) - - -INSTALL( TARGETS hamilton-jacobi-parallel-map - RUNTIME DESTINATION bin - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) - -#INSTALL( FILES ${tnl_hamilton_jacobi_parallel_map_SOURCES} -# DESTINATION ${TNL_TARGET_DATA_DIRECTORY}/examples/hamilton-jacobi-parallel-map ) diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/MainBuildConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/MainBuildConfig.h deleted file mode 100644 index ed3d686eb99379af1589d734eac9b5812cccdedf..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/MainBuildConfig.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - MainBuildConfig.h - description - ------------------- - begin : Jul 7, 2014 - copyright : (C) 2014 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef MAINBUILDCONFIG_H_ -#define MAINBUILDCONFIG_H_ - -#include <solvers/tnlBuildConfigTags.h> - -class MainBuildConfig -{ - public: - - static void print() {std::cerr << "MainBuildConfig" <<std::endl; } -}; - -/**** - * Turn off support for float and long double. - */ -template<> struct tnlConfigTagReal< MainBuildConfig, float > { enum { enabled = false }; }; -template<> struct tnlConfigTagReal< MainBuildConfig, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct tnlConfigTagIndex< MainBuildConfig, short int >{ enum { enabled = false }; }; -template<> struct tnlConfigTagIndex< MainBuildConfig, long int >{ enum { enabled = false }; }; - -/**** - * Use of tnlGrid is enabled for allowed dimensions and Real, Device and Index types. - */ -template< int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< MainBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< MainBuildConfig, Dimensions >::enabled && - tnlConfigTagReal< MainBuildConfig, Real >::enabled && - tnlConfigTagDevice< MainBuildConfig, Device >::enabled && - tnlConfigTagIndex< MainBuildConfig, Index >::enabled }; }; - -/**** - * Please, chose your preferred time discretisation here. - */ -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = false}; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; - -/**** - * Only the Runge-Kutta-Merson solver is enabled by default. - */ -template<> struct tnlConfigTagExplicitSolver< MainBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; - -#endif /* MAINBUILDCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/gnuplot.txt b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/gnuplot.txt deleted file mode 100644 index d4ae61983910a676269a23e3d992f5f46ea83a8f..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/gnuplot.txt +++ /dev/null @@ -1,32 +0,0 @@ -tomas@tomas-linux:~/Desktop/VU_CPU_MAPA/work_dir$ gnuplot - - G N U P L O T - Version 4.6 patchlevel 4 last modified 2013-10-02 - Build System: Linux x86_64 - - Copyright (C) 1986-1993, 1998, 2004, 2007-2013 - Thomas Williams, Colin Kelley and many others - - gnuplot home: http://www.gnuplot.info - faq, bugs, etc: type "help FAQ" - immediate help: type "help" (plot window: hit 'h') - -Terminal type set to 'wxt' -gnuplot> set cntrparam levels 15 -gnuplot> set cntrparam bspline -gnuplot> set contour -gnuplot> splot 'u-00001.gplt' - -gnuplot> unset surface -gnuplot> splot 'u-00001.gplt' - -gnuplot> set table "test.gplt" -gnuplot> splot 'u-00001.gplt' -gnuplot> unset table - -gnuplot> set table "test2.gplt" -gnuplot> plot 'test.gplt' index 10 -gnuplot> unset table - -gnuplot> plot 'test2.gplt' - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.cpp b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.cpp deleted file mode 100644 index b13498e17330fae7bb00a0bdc2abcc7a19f8e7a8..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Jul 8 , 2014 - copyright : (C) 2014 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.cu b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.cu deleted file mode 100644 index 7101976712e153d73c5f0979b211164a36ec648d..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.cu +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cu - description - ------------------- - begin : Mar 30 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.h deleted file mode 100644 index fff21c77eb5980a3f3f86c28170b4169dd6f7917..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/main.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - main.h - description - ------------------- - begin : Mar 22 , 2016 - copyright : (C) 2016 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "tnlParallelMapSolver.h" -#include "parallelMapConfig.h" -#include "MainBuildConfig.h" -#include <solvers/tnlBuildConfigTags.h> -#include <operators/hamilton-jacobi/godunov-eikonal/parallelGodunovMap.h> -#include <mesh/tnlGrid.h> -#include <core/tnlDevice.h> -#include <time.h> -#include <ctime> - -typedef MainBuildConfig BuildConfig; - -int main( int argc, char* argv[] ) -{ - time_t start; - time_t stop; - time(&start); - std::clock_t start2= std::clock(); - Config::ParameterContainer parameters; - tnlConfigDescription configDescription; - parallelMapConfig< BuildConfig >::configSetup( configDescription ); - - if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) - return false; - - - tnlDeviceEnum device; - device = TNL::Devices::HostDevice; - - const int& dim = parameters.getParameter< int >( "dim" ); - - if(dim == 2) - { - - typedef parallelGodunovMapScheme< tnlGrid<2,double,TNL::Devices::Host, int>, double, int > SchemeTypeHost; -/*#ifdef HAVE_CUDA - typedef parallelGodunovMapScheme< tnlGrid<2,double,tnlCuda, int>, double, int > SchemeTypeDevice; -#endif -#ifndef HAVE_CUDA*/ - typedef parallelGodunovMapScheme< tnlGrid<2,double,TNL::Devices::Host, int>, double, int > SchemeTypeDevice; -/*#endif*/ - - if(device==TNL::Devices::HostDevice) - { - typedef TNL::Devices::Host Device; - - - tnlParallelMapSolver<2,SchemeTypeHost,SchemeTypeDevice, Device> solver; - if(!solver.init(parameters)) - { - std::cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver loop..." <<std::endl; - solver.run(); - } - else if(device==tnlCudaDevice ) - { - typedef tnlCuda Device; -//typedef parallelGodunovMapScheme< tnlGrid<2,double,Device, int>, double, int > SchemeType; - - tnlParallelMapSolver<2,SchemeTypeHost,SchemeTypeDevice, Device> solver; - if(!solver.init(parameters)) - { - std::cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver loop..." <<std::endl; - solver.run(); - } - } - - - time(&stop); - cout <<std::endl; - cout << "Running time was: " << difftime(stop,start) << " .... " << (std::clock() - start2) / (double)(CLOCKS_PER_SEC) <<std::endl; - return EXIT_SUCCESS; -} - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/mapa_png.png b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/mapa_png.png deleted file mode 100644 index 668b6fe24b17b2fec486db28505b41e3beb2091a..0000000000000000000000000000000000000000 Binary files a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/mapa_png.png and /dev/null differ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/no-Makefile b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/no-Makefile deleted file mode 100644 index bfdc1ef236ca02ecfe6bc88f81d872e9524ec621..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/no-Makefile +++ /dev/null @@ -1,41 +0,0 @@ -TNL_VERSION=0.1 -TNL_INSTALL_DIR=${HOME}/local/lib -TNL_INCLUDE_DIR=${HOME}/local/include/tnl-${TNL_VERSION} - -TARGET = hamiltonJacobiParallelSolver -#CONFIG_FILE = $(TARGET).cfg.desc -INSTALL_DIR = ${HOME}/local -CXX = g++ -CUDA_CXX = nvcc -OMP_FLAGS = -DHAVE_OPENMP -fopenmp -CXX_FLAGS = -std=gnu++0x -I$(TNL_INCLUDE_DIR) -O3 $(OMP_FLAGS) -DDEBUG -LD_FLAGS = -L$(TNL_INSTALL_DIR) -ltnl-0.1 -lgomp - -SOURCES = main.cpp -HEADERS = -OBJECTS = main.o -DIST = $(SOURCES) Makefile - -all: $(TARGET) -clean: - rm -f $(OBJECTS) - rm -f $(TARGET)-conf.h - -dist: $(DIST) - tar zcvf $(TARGET).tgz $(DIST) - -install: $(TARGET) - cp $(TARGET) $(INSTALL_DIR)/bin - cp $(CONFIG_FILE) $(INSTALL_DIR)/share - -uninstall: $(TARGET) - rm -f $(INSTALL_DIR)/bin/$(TARGET) - rm -f $(CONFIG_FILE) $(INSTALL_DIR)/share - -$(TARGET): $(OBJECTS) - $(CXX) -o $(TARGET) $(OBJECTS) $(LD_FLAGS) - -%.o: %.cpp $(HEADERS) - $(CXX) -c -o $@ $(CXX_FLAGS) $< - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/parallelMapConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/parallelMapConfig.h deleted file mode 100644 index c07ee95aa04bb8c7a1f3cc376aabd859ff7bc5be..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/parallelMapConfig.h +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - parallelMapConfig.h - description - ------------------- - begin : Mar 22 , 2016 - copyright : (C) 2016 by Tomas Sobotik - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef HAMILTONJACOBIPARALLELMAPPROBLEMCONFIG_H_ -#define HAMILTONJACOBIPARALLELMAPPROBLEMCONFIG_H_ - -#include <config/tnlConfigDescription.h> - -template< typename ConfigTag > -class parallelMapConfig -{ - public: - static void configSetup( tnlConfigDescription& config ) - { - config.addDelimiter( "Parallel Eikonal solver settings:" ); - config.addEntry < String > ( "problem-name", "This defines particular problem.", "hamilton-jacobi-parallel" ); - config.addEntry < String > ( "scheme", "This defines scheme used for discretization.", "godunov" ); - config.addEntryEnum( "godunov" ); - config.addEntryEnum( "upwind" ); - config.addRequiredEntry < String > ( "initial-condition", "Initial condition for solver"); - config.addRequiredEntry < String > ( "map", "Gradient map for solver"); - config.addEntry < String > ( "mesh", "Name of mesh.", "mesh.tnl" ); - config.addEntry < double > ( "epsilon", "This defines epsilon for smoothening of sign().", 0.0 ); - config.addEntry < double > ( "delta", " Allowed difference on subgrid boundaries", 0.0 ); - config.addRequiredEntry < double > ( "stop-time", " Final time for solver"); - config.addRequiredEntry < double > ( "initial-tau", " initial tau for solver" ); - config.addEntry < double > ( "cfl-condition", " CFL condition", 0.0 ); - config.addEntry < int > ( "subgrid-size", "Subgrid size.", 16 ); - config.addRequiredEntry < int > ( "dim", "Dimension of problem."); - } -}; - -#endif /* HAMILTONJACOBIPARALLELMAPPROBLEMCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/run b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/run deleted file mode 100755 index 48441996274633f8d391d9b32978b05b2e4fa263..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/run +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -dimensions=2 - -size=2 - -time=50 - -rm -r work_dir -mkdir work_dir -cp mapa_png.png work_dir/mapa_png.png -cd work_dir - -tnl-image-converter --image-format png\ - --input-images mapa_png.png - - -tnl-init --test-function sdf-para \ - --x-centre 0.5 \ - --y-centre 1.0 \ - --offset 0.05 \ - --output-file init.tnl \ - --final-time 0.0 \ - --snapshot-period 0.1 - -hamilton-jacobi-parallel-map-dbg --initial-condition init.tnl \ - --map mapa_png.tnl \ - --cfl-condition 50 \ - --mesh mesh.tnl \ - --initial-tau 1.0e-3 \ - --epsilon 4.0 \ - --delta 0.0 \ - --stop-time $time \ - --scheme godunov \ - --subgrid-size 8 \ - --dim $dimensions - - -#cp ../template.dat1 template.dat1 -#cp ../template.dat2 template.dat2 -#cp ../gplt2eps.py gplt2eps.py -cd .. - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnl-err2eoc-2.py b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnl-err2eoc-2.py deleted file mode 100755 index f8cde3768e9b76156507e133f8bc3ecaa526fc71..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnl-err2eoc-2.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python - -import sys, string, math - -arguments = sys. argv[1:] -format = "txt" -output_file_name = "eoc-table.txt" -input_files = [] -verbose = 1 -size = 1.0 - -i = 0 -while i < len( arguments ): - if arguments[ i ] == "--format": - format = arguments[ i + 1 ] - i = i + 2 - continue - if arguments[ i ] == "--output-file": - output_file_name = arguments[ i + 1 ] - i = i + 2 - continue - if arguments[ i ] == "--verbose": - verbose = float( arguments[ i + 1 ] ) - i = i +2 - continue - if arguments[ i ] == "--size": - size = float( arguments[ i + 1 ] ) - i = i +2 - continue - input_files. append( arguments[ i ] ) - i = i + 1 - -if not verbose == 0: - print "Writing to " + output_file_name + " in " + format + "." - -h_list = [] -l1_norm_list = [] -l2_norm_list = [] -max_norm_list = [] -items = 0 - -for file_name in input_files: - if not verbose == 0: - print "Processing file " + file_name - file = open( file_name, "r" ) - - l1_max = 0.0 - l_max_max = 0.0 - file.readline(); - file.readline(); - for line in file. readlines(): - data = string. split( line ) - h_list. append( size/(float(file_name[0:len(file_name)-5] ) - 1.0) ) - l1_norm_list. append( float( data[ 1 ] ) ) - l2_norm_list. append( float( data[ 2 ] ) ) - max_norm_list. append( float( data[ 3 ] ) ) - items = items + 1 - if not verbose == 0: - print line - file. close() - -h_width = 12 -err_width = 15 -file = open( output_file_name, "w" ) -if format == "latex": - file. write( "\\begin{tabular}{|r|l|l|l|l|l|l|}\\hline\n" ) - file. write( "\\raisebox{-1ex}[0ex]{$h$}& \n" ) - file. write( "\\multicolumn{2}{|c|}{\\raisebox{1ex}[3.5ex]{$\\left\| \\cdot \\right\\|_{L_1\\left(\\omega_h;\\left[0,T\\right]\\right)}^{h,\\tau}$}}& \n" ) - file. write( "\\multicolumn{2}{|c|}{\\raisebox{1ex}[3.5ex]{$\\left\| \\cdot \\right\\|_{L_2\\left(\\omega_h;\left[0,T\\right]\\right)}^{h,\\tau}$}}& \n" ) - file. write( "\\multicolumn{2}{|c|}{\\raisebox{1ex}[3.5ex]{$\\left\| \\cdot \\right\\|_{L_\\infty\\left(\\omega_h;\\left[0,T\\right]\\right)}^{h,\\tau}$}}\\\\ \\cline{2-7} \n" ) - file. write( " " + string. rjust( " ", h_width ) + "&" + - string. rjust( "Error", err_width ) + "&" + - string. rjust( "{\\bf EOC}", err_width ) + "&" + - string. rjust( "Error", err_width ) + "&" + - string. rjust( "{\\bf EOC}", err_width ) + "&" + - string. rjust( "Error.", err_width ) + "&" + - string. rjust( "{\\bf EOC}", err_width ) + - "\\\\ \\hline \\hline \n") -if format == "txt": - file. write( "+--------------+----------------+----------------+----------------+----------------+----------------+----------------+\n" ) - file. write( "| h | L1 Err. | L1 EOC. | L2 Err. | L2 EOC | MAX Err. | MAX EOC |\n" ) - file. write( "+==============+================+================+================+================+================+================+\n" ) - - -i = 0 -while i < items: - if i == 0: - if format == "latex": - file. write( " " + string. ljust( str( h_list[ i ] ), h_width ) + "&" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + "&" + - string. rjust( " ", err_width ) + "&"+ - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + "&" + - string. rjust( " ", err_width ) + "&" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + "&" + - string. rjust( " ", err_width ) + "\\\\\n" ) - if format == "txt": - file. write( "| " + string. ljust( str( h_list[ i ] ), h_width ) + " |" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + " |" + - string. rjust( " ", err_width ) + " |" + - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + " |" + - string. rjust( " ", err_width ) + " |" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + " |" + - string. rjust( " ", err_width ) + " |\n" ) - file. write( "+--------------+----------------+----------------+----------------+----------------+----------------+----------------+\n" ) - i = i + 1; - continue - if h_list[ i ] == h_list[ i - 1 ]: - print "Unable to count eoc since h[ " + \ - str( i ) + " ] = h[ " + str( i - 1 ) + \ - " ] = " + str( h_list[ i ] ) + ". \n" - file. write( " eoc error: h[ " + \ - str( i ) + " ] = h[ " + str( i - 1 ) + \ - " ] = " + str( h_list[ i ] ) + ". \n" ) - else: - h_ratio = math. log( h_list[ i ] / h_list[ i - 1 ] ) - l1_ratio = math. log( l1_norm_list[ i ] / l1_norm_list[ i - 1 ] ) - l2_ratio = math. log( l2_norm_list[ i ] / l2_norm_list[ i - 1 ] ) - max_ratio = math. log( max_norm_list[ i ] / max_norm_list[ i - 1 ] ) - if format == "latex": - file. write( " " + string. ljust( str( h_list[ i ] ), h_width ) + "&" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + "&" + - string. rjust( "{\\bf " + "%.2g" % ( l1_ratio / h_ratio ) + "}", err_width ) + "&" + - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + "&" + - string. rjust( "{\\bf " + "%.2g" % ( l2_ratio / h_ratio ) + "}", err_width ) + "&" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + "&" + - string. rjust( "{\\bf " + "%.2g" % ( max_ratio / h_ratio ) + "}", err_width ) + "\\\\\n" ) - if format == "txt": - file. write( "| " + string. ljust( str( h_list[ i ] ), h_width ) + " |" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + " |" + - string. rjust( "**" + "%.2g" % ( l1_ratio / h_ratio ) + "**", err_width ) + " |" + - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + " |" + - string. rjust( "**" + "%.2g" % ( l2_ratio / h_ratio ) + "**", err_width ) + " |" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + " |" + - string. rjust( "**" + "%.2g" % ( max_ratio / h_ratio ) + "**", err_width ) + " |\n" ) - file. write( "+--------------+----------------+----------------+----------------+----------------+----------------+----------------+\n" ) - i = i + 1 - -if format == "latex": - file. write( "\\hline \n" ) - file. write( "\\end{tabular} \n" ) - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnlParallelMapSolver.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnlParallelMapSolver.h deleted file mode 100644 index 400e163c9dcc8d536a478a0952aabf8ccbb1a2d8..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnlParallelMapSolver.h +++ /dev/null @@ -1,217 +0,0 @@ -/*************************************************************************** - tnlParallelMapSolver.h - description - ------------------- - begin : Mar 22 , 2016 - copyright : (C) 2016 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef TNLPARALLELMAPSOLVER_H_ -#define TNLPARALLELMAPSOLVER_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <functions/tnlMeshFunction.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> -#include <limits.h> -#include <core/tnlDevice.h> - - -#include <ctime> - -#ifdef HAVE_CUDA -#include <core/tnlCuda.h> -#endif - - -template< int Dimension, - typename SchemeHost, - typename SchemeDevice, - typename Device, - typename RealType = double, - typename IndexType = int > -class tnlParallelMapSolver -{}; - -template<typename SchemeHost, typename SchemeDevice, typename Device> -class tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int > -{ -public: - - typedef SchemeDevice SchemeTypeDevice; - typedef SchemeHost SchemeTypeHost; - typedef Device DeviceType; - typedef TNL::Containers::Vector< double, TNL::Devices::Host, int > VectorType; - typedef TNL::Containers::Vector< int, TNL::Devices::Host, int > IntVectorType; - typedef tnlGrid< 2, double, TNL::Devices::Host, int > MeshType; -#ifdef HAVE_CUDA - typedef TNL::Containers::Vector< double, TNL::Devices::Host, int > VectorTypeCUDA; - typedef TNL::Containers::Vector< int, TNL::Devices::Host, int > IntVectorTypeCUDA; - typedef tnlGrid< 2, double, TNL::Devices::Host, int > MeshTypeCUDA; -#endif - tnlParallelMapSolver(); - bool init( const Config::ParameterContainer& parameters ); - void run(); - - void test(); - -/*private:*/ - - - void synchronize(); - - int getOwner( int i) const; - - int getSubgridValue( int i ) const; - - void setSubgridValue( int i, int value ); - - int getBoundaryCondition( int i ) const; - - void setBoundaryCondition( int i, int value ); - - void stretchGrid(); - - void contractGrid(); - - VectorType getSubgrid( const int i ) const; - - void insertSubgrid( VectorType u, const int i ); - - VectorType runSubgrid( int boundaryCondition, VectorType u, int subGridID,VectorType map); - - - tnlMeshFunction<MeshType> u0; - VectorType work_u, map_stretched, map; - IntVectorType subgridValues, boundaryConditions, unusedCell, calculationsCount; - MeshType mesh, subMesh; - -// tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage > Entity; - - SchemeHost schemeHost; - SchemeDevice schemeDevice; - double delta, tau0, stopTime,cflCondition; - int gridRows, gridCols, gridLevels, currentStep, n; - - std::clock_t start; - double time_diff; - - - tnlDeviceEnum device; - - tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* getSelf() - { - return this; - }; - -#ifdef HAVE_CUDA - - tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver; - - double* work_u_cuda; - double* map_stretched_cuda; - - int* subgridValues_cuda; - int* boundaryConditions_cuda; - int* unusedCell_cuda; - int* calculationsCount_cuda; - double* tmpw; - double* tmp_map; - - - int* runcuda; - int run_host; - - - __device__ void getSubgridCUDA2D( const int i, tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller, double* a); - - __device__ void updateSubgridCUDA2D( const int i, tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller, double* a); - - __device__ void insertSubgridCUDA2D( double u, const int i ); - - __device__ void runSubgridCUDA2D( int boundaryCondition, double* u, int subGridID); - - __device__ int getOwnerCUDA2D( int i) const; - - __device__ int getSubgridValueCUDA2D( int i ) const; - - __device__ void setSubgridValueCUDA2D( int i, int value ); - - __device__ int getBoundaryConditionCUDA2D( int i ) const; - - __device__ void setBoundaryConditionCUDA2D( int i, int value ); - -#endif - -}; - - - - - - - - - - - - - - -#ifdef HAVE_CUDA -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void runCUDA2D(tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void initRunCUDA2D(tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void initCUDA2D( tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver, double* ptr, int * ptr2, int* ptr3, double* tmp_map_ptr); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void synchronizeCUDA2D(tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void synchronize2CUDA2D(tnlParallelMapSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - - - -__device__ -double fabsMin( double x, double y) -{ - double fx = abs(x); - - if(Min(fx,abs(y)) == fx) - return x; - else - return y; -} - -__device__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(__longlong_as_double(assumed),val) )); - } while (assumed != old); - return __longlong_as_double(old); -} - -#endif - -#include "tnlParallelMapSolver2D_impl.h" -#endif /* TNLPARALLELMAPSOLVER_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnlParallelMapSolver2D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnlParallelMapSolver2D_impl.h deleted file mode 100644 index e8cbc6fc1619c8a936a0239a5b4e0056361412e3..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel-map/tnlParallelMapSolver2D_impl.h +++ /dev/null @@ -1,1315 +0,0 @@ -/*************************************************************************** - tnlParallelMapSolver2D_impl.h - description - ------------------- - begin : Mar 22 , 2016 - copyright : (C) 2016 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef TNLPARALLELMAPSOLVER2D_IMPL_H_ -#define TNLPARALLELMAPSOLVER2D_IMPL_H_ - - -#include "tnlParallelMapSolver.h" -#include <core/mfilename.h> - - - - -#define MAP_SOLVER_MAX_VALUE 3 - - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::tnlParallelMapSolver() -{ - this->device = TNL::Devices::HostDevice; /////////////// tnlCuda Device --- vypocet na GPU, TNL::Devices::HostDevice --- vypocet na CPU - -#ifdef HAVE_CUDA - if(this->device == tnlCudaDevice) - { - run_host = 1; - } -#endif - -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::test() -{ -/* - for(int i =0; i < this->subgridValues.getSize(); i++ ) - { - insertSubgrid(getSubgrid(i), i); - } -*/ -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> - -bool tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::init( const Config::ParameterContainer& parameters ) -{ - cout << "Initializating solver..." <<std::endl; - const String& meshLocation = parameters.getParameter <String>("mesh"); - this->mesh.load( meshLocation ); - - this->n = parameters.getParameter <int>("subgrid-size"); - cout << "Setting N to " << this->n <<std::endl; - - this->subMesh.setDimensions( this->n, this->n ); - this->subMesh.setDomain( Containers::StaticVector<2,double>(0.0, 0.0), - Containers::StaticVector<2,double>(mesh.template getSpaceStepsProducts< 1, 0 >()*(double)(this->n), mesh.template getSpaceStepsProducts< 0, 1 >()*(double)(this->n)) ); - - this->subMesh.save("submesh.tnl"); - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - this->u0.load( initialCondition ); - - /* LOAD MAP */ - const String& mapFile = parameters.getParameter <String>("map"); - if(! this->map.load( mapFile )) - cout << "Failed to load map file : " << mapFile <<std::endl; - - - this->delta = parameters.getParameter <double>("delta"); - this->delta *= mesh.template getSpaceStepsProducts< 1, 0 >()*mesh.template getSpaceStepsProducts< 0, 1 >(); - - cout << "Setting delta to " << this->delta <<std::endl; - - this->tau0 = parameters.getParameter <double>("initial-tau"); - cout << "Setting initial tau to " << this->tau0 <<std::endl; - this->stopTime = parameters.getParameter <double>("stop-time"); - - this->cflCondition = parameters.getParameter <double>("cfl-condition"); - this -> cflCondition *= sqrt(mesh.template getSpaceStepsProducts< 1, 0 >()*mesh.template getSpaceStepsProducts< 0, 1 >()); - cout << "Setting CFL to " << this->cflCondition <<std::endl; - - stretchGrid(); - this->stopTime /= (double)(this->gridCols); - this->stopTime *= (1.0+1.0/((double)(this->n) - 2.0)); - cout << "Setting stopping time to " << this->stopTime <<std::endl; - - cout << "Initializating scheme..." <<std::endl; - if(!this->schemeHost.init(parameters)) - { - cerr << "SchemeHost failed to initialize." <<std::endl; - return false; - } - cout << "Scheme initialized." <<std::endl; - - test(); - - VectorType* tmp = new VectorType[subgridValues.getSize()]; - bool containsCurve = false; - -#ifdef HAVE_CUDA - - if(this->device == tnlCudaDevice) - { - cudaMalloc(&(this->cudaSolver), sizeof(tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >)); - cudaMemcpy(this->cudaSolver, this,sizeof(tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >), cudaMemcpyHostToDevice); - - double** tmpdev = NULL; - cudaMalloc(&tmpdev, sizeof(double*)); - cudaMalloc(&(this->tmpw), this->work_u.getSize()*sizeof(double)); - cudaMalloc(&(this->tmp_map), this->map_stretched.getSize()*sizeof(double)); - cudaMalloc(&(this->runcuda), sizeof(int)); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - int* tmpUC; - cudaMalloc(&(tmpUC), this->work_u.getSize()*sizeof(int)); - cudaMemcpy(tmpUC, this->unusedCell.getData(), this->unusedCell.getSize()*sizeof(int), cudaMemcpyHostToDevice); - - initCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<1,1>>>(this->cudaSolver, (this->tmpw), (this->runcuda),tmpUC, tmp_map); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - double* tmpu = NULL; - cudaMemcpy(&tmpu, tmpdev,sizeof(double*), cudaMemcpyDeviceToHost); - cudaMemcpy((this->tmpw), this->work_u.getData(), this->work_u.getSize()*sizeof(double), cudaMemcpyHostToDevice); - cudaMemcpy((this->tmp_map), this->map_stretched.getData(), this->map_stretched.getSize()*sizeof(double), cudaMemcpyHostToDevice); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - } -#endif - - if(this->device == TNL::Devices::HostDevice) - { - VectorType tmp_map; - tmp_map.setSize(this->n * this->n); - for(int i = 0; i < this->subgridValues.getSize(); i++) - { - - if(! tmp[i].setSize(this->n * this->n)) - cout << "Could not allocate tmp["<< i <<"] array." <<std::endl; - tmp[i] = getSubgrid(i); - containsCurve = false; - - for(int j = 0; j < tmp[i].getSize(); j++) - { - if(tmp[i][0]*tmp[i][j] <= 0.0) - { - containsCurve = true; - j=tmp[i].getSize(); - } - - } - if(containsCurve) - { - for( int j = 0; j < tmp_map.getSize(); j++) - { - tmp_map[j] = this->map_stretched[ (i / this->gridCols) * this->n*this->n*this->gridCols - + (i % this->gridCols) * this->n - + (j/this->n) * this->n*this->gridCols - + (j % this->n) ]; - } - //cout << "Computing initial SDF on subgrid " << i << "." <<std::endl; - tmp[i] = runSubgrid(0, tmp[i],i,tmp_map); - insertSubgrid(tmp[i], i); - setSubgridValue(i, 4); - //cout << "Computed initial SDF on subgrid " << i << "." <<std::endl; - } - containsCurve = false; - - } - } -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - dim3 threadsPerBlock(this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initRunCUDA2D<SchemeTypeHost,SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock,3*this->n*this->n*sizeof(double)>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - } -#endif - - - this->currentStep = 1; - if(this->device == TNL::Devices::HostDevice) - synchronize(); -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - dim3 threadsPerBlock(this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows); - - synchronizeCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - synchronize2CUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - } - -#endif - cout << "Solver initialized." <<std::endl; - - return true; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::run() -{ - if(this->device == TNL::Devices::HostDevice) - { - while ((this->boundaryConditions.max() > 0 )/* || !end*/) - { - -#ifdef HAVE_OPENMP -#pragma omp parallel for num_threads(4) schedule(dynamic) -#endif - for(int i = 0; i < this->subgridValues.getSize(); i++) - { - if(getSubgridValue(i) != INT_MAX) - { - VectorType tmp, tmp_map; - tmp.setSize(this->n * this->n); - tmp_map.setSize(this->n * this->n); - for( int j = 0; j < tmp_map.getSize(); j++) - { - tmp_map[j] = this->map_stretched[ (i / this->gridCols) * this->n*this->n*this->gridCols - + (i % this->gridCols) * this->n - + (j/this->n) * this->n*this->gridCols - + (j % this->n) ]; - } - - if(getSubgridValue(i) == currentStep+4) - { - - if(getBoundaryCondition(i) & 1) - { - tmp = getSubgrid(i); - tmp = runSubgrid(1, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 2) - { - tmp = getSubgrid(i); - tmp = runSubgrid(2, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 4) - { - tmp = getSubgrid(i); - tmp = runSubgrid(4, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 8) - { - tmp = getSubgrid(i); - tmp = runSubgrid(8, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - } - else - { - - if(getBoundaryCondition(i) == 1) - { - tmp = getSubgrid(i); - tmp = runSubgrid(1, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) == 2) - { - tmp = getSubgrid(i); - tmp = runSubgrid(2, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) == 4) - { - tmp = getSubgrid(i); - tmp = runSubgrid(4, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) == 8) - { - tmp = getSubgrid(i); - tmp = runSubgrid(8, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - } - - if(getBoundaryCondition(i) & 3) - { - //cout << "3 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(3, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - } - if(getBoundaryCondition(i) & 5) - { - //cout << "5 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(5, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - } - if(getBoundaryCondition(i) & 10) - { - //cout << "10 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(10, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - } - if(getBoundaryCondition(i) & 12) - { - //cout << "12 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(12, tmp ,i,tmp_map); - insertSubgrid( tmp, i); - } - - - setBoundaryCondition(i, 0); - - setSubgridValue(i, getSubgridValue(i)-1); - - } - } - synchronize(); - } - } -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - bool end_cuda = false; - dim3 threadsPerBlock(this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - bool* tmpb; - cudaMemcpy(&(this->run_host),this->runcuda,sizeof(int), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - - int i = 1; - time_diff = 0.0; - while (run_host || !end_cuda) - { - cout << "Computing at step "<< i++ <<std::endl; - if(run_host != 0 ) - end_cuda = true; - else - end_cuda = false; - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - start = std::clock(); - runCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock,3*this->n*this->n*sizeof(double)>>>(this->cudaSolver); - cudaDeviceSynchronize(); - time_diff += (std::clock() - start) / (double)(CLOCKS_PER_SEC); - - //start = std::clock(); - synchronizeCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - synchronize2CUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //time_diff += (std::clock() - start) / (double)(CLOCKS_PER_SEC); - - cudaMemcpy(&run_host, (this->runcuda),sizeof(int), cudaMemcpyDeviceToHost); - } - cout << "Solving time was: " << time_diff <<std::endl; - - cudaMemcpy(this->work_u.getData()/* test*/, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - - cudaDeviceSynchronize(); - } -#endif - contractGrid(); - this->u0.save("u-00001.tnl"); - cout << "Maximum number of calculations on one subgrid was " << this->calculationsCount.absMax() <<std::endl; - cout << "Average number of calculations on one subgrid was " << ( (double) this->calculationsCount.sum() / (double) this->calculationsCount.getSize() ) <<std::endl; - cout << "Solver finished" <<std::endl; - -#ifdef HAVE_CUDA - if(this->device == tnlCudaDevice) - { - cudaFree(this->runcuda); - cudaFree(this->tmpw); - cudaFree(this->tmp_map); - cudaFree(this->cudaSolver); - } -#endif - -} - -//north - 1, east - 2, west - 4, south - 8 -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::synchronize() //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now -{ - cout << "Synchronizig..." <<std::endl; - int tmp1, tmp2; - int grid1, grid2; - -// if(this->currentStep & 1) -// { - for(int j = 0; j < this->gridRows - 1; j++) - { - for (int i = 0; i < this->gridCols*this->n; i++) - { - tmp1 = this->gridCols*this->n*((this->n-1)+j*this->n) + i; - tmp2 = this->gridCols*this->n*((this->n)+j*this->n) + i; - grid1 = getSubgridValue(getOwner(tmp1)); - grid2 = getSubgridValue(getOwner(tmp2)); - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j" << i << "," << j <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp2)) & 8) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+8); - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; - this->unusedCell[tmp1] = 0; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp1)) & 1) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+1); - } - } - } - -// } -// else -// { - for(int i = 1; i < this->gridCols; i++) - { - for (int j = 0; j < this->gridRows*this->n; j++) - { - tmp1 = this->gridCols*this->n*j + i*this->n - 1; - tmp2 = this->gridCols*this->n*j + i*this->n ; - grid1 = getSubgridValue(getOwner(tmp1)); - grid2 = getSubgridValue(getOwner(tmp2)); - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j" << i << "," << j <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp2)) & 4) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+4); - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; - this->unusedCell[tmp1] = 0; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp1)) & 2) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+2); - } - } - } -// } - - - this->currentStep++; - int stepValue = this->currentStep + 4; - for (int i = 0; i < this->subgridValues.getSize(); i++) - { - if( getSubgridValue(i) == -INT_MAX ) - setSubgridValue(i, stepValue); - } - - cout << "Grid synchronized at step " << (this->currentStep - 1 ) <<std::endl; - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getOwner(int i) const -{ - - return (i / (this->gridCols*this->n*this->n))*this->gridCols + (i % (this->gridCols*this->n))/this->n; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgridValue( int i ) const -{ - return this->subgridValues[i]; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setSubgridValue(int i, int value) -{ - this->subgridValues[i] = value; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getBoundaryCondition( int i ) const -{ - return this->boundaryConditions[i]; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setBoundaryCondition(int i, int value) -{ - this->boundaryConditions[i] = value; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::stretchGrid() -{ - cout << "Stretching grid..." <<std::endl; - - - this->gridCols = ceil( ((double)(this->mesh.getDimensions().x()-1)) / ((double)(this->n-1)) ); - this->gridRows = ceil( ((double)(this->mesh.getDimensions().y()-1)) / ((double)(this->n-1)) ); - - - cout << "Setting gridCols to " << this->gridCols << "." <<std::endl; - cout << "Setting gridRows to " << this->gridRows << "." <<std::endl; - - this->subgridValues.setSize(this->gridCols*this->gridRows); - this->subgridValues.setValue(0); - this->boundaryConditions.setSize(this->gridCols*this->gridRows); - this->boundaryConditions.setValue(0); - this->calculationsCount.setSize(this->gridCols*this->gridRows); - this->calculationsCount.setValue(0); - - for(int i = 0; i < this->subgridValues.getSize(); i++ ) - { - this->subgridValues[i] = INT_MAX; - this->boundaryConditions[i] = 0; - } - - int stretchedSize = this->n*this->n*this->gridCols*this->gridRows; - - if(!this->work_u.setSize(stretchedSize)) - cerr << "Could not allocate memory for stretched grid." <<std::endl; - if(!this->map_stretched.setSize(stretchedSize)) - cerr << "Could not allocate memory for stretched map." <<std::endl; - if(!this->unusedCell.setSize(stretchedSize)) - cerr << "Could not allocate memory for supporting stretched grid." <<std::endl; - int idealStretch =this->mesh.getDimensions().x() + (this->mesh.getDimensions().x()-2)/(this->n-1); - cout << idealStretch <<std::endl; - - for(int i = 0; i < stretchedSize; i++) - { - this->unusedCell[i] = 1; - int diff =(this->n*this->gridCols) - idealStretch ; - int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)) + (i/(this->n*this->gridCols))*diff; - - if(i%(this->n*this->gridCols) - idealStretch >= 0) - { - k+= i%(this->n*this->gridCols) - idealStretch +1 ; - } - - if(i/(this->n*this->gridCols) - idealStretch + 1 > 0) - { - k+= (i/(this->n*this->gridCols) - idealStretch +1 )* this->mesh.getDimensions().x() ; - } - - - if(fabs(this->u0[i-k]) < mesh.template getSpaceStepsProducts< 1, 0 >()+mesh.template getSpaceStepsProducts< 0, 1 >() ) - this->work_u[i] = this->u0[i-k]; - else - this->work_u[i] = sign(this->u0[i-k])*MAP_SOLVER_MAX_VALUE; - - this->map_stretched[i] = this->map[i-k]; - } - - - cout << "Grid stretched." <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::contractGrid() -{ - cout << "Contracting grid..." <<std::endl; - int stretchedSize = this->n*this->n*this->gridCols*this->gridRows; - - int idealStretch =this->mesh.getDimensions().x() + (this->mesh.getDimensions().x()-2)/(this->n-1); - cout << idealStretch <<std::endl; - - for(int i = 0; i < stretchedSize; i++) - { - int diff =(this->n*this->gridCols) - idealStretch ; - int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)) + (i/(this->n*this->gridCols))*diff; - - if((i%(this->n*this->gridCols) - idealStretch < 0) && (i/(this->n*this->gridCols) - idealStretch + 1 <= 0)) - { - this->u0[i-k] = this->work_u[i]; - } - - } - - cout << "Grid contracted" <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -typename tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::VectorType -tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgrid( const int i ) const -{ - VectorType u; - u.setSize(this->n*this->n); - - for( int j = 0; j < u.getSize(); j++) - { - u[j] = this->work_u[ (i / this->gridCols) * this->n*this->n*this->gridCols - + (i % this->gridCols) * this->n - + (j/this->n) * this->n*this->gridCols - + (j % this->n) ]; - } - return u; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::insertSubgrid( VectorType u, const int i ) -{ - - for( int j = 0; j < this->n*this->n; j++) - { - int index = (i / this->gridCols)*this->n*this->n*this->gridCols + (i % this->gridCols)*this->n + (j/this->n)*this->n*this->gridCols + (j % this->n); - if( (fabs(this->work_u[index]) > fabs(u[j])) || (this->unusedCell[index] == 1) ) - { - this->work_u[index] = u[j]; - this->unusedCell[index] = 0; - } - } -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -typename tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::VectorType -tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::runSubgrid( int boundaryCondition, VectorType u, int subGridID,VectorType map) -{ - - VectorType fu; - - fu.setLike(u); - fu.setValue( 0.0 ); - - - - bool tmp = false; - for(int i = 0; i < u.getSize(); i++) - { - if(u[0]*u[i] <= 0.0) - tmp=true; - int centerGID = (this->n*(subGridID / this->gridRows)+ (this->n >> 1))*(this->n*this->gridCols) + this->n*(subGridID % this->gridRows) + (this->n >> 1); - if(this->unusedCell[centerGID] == 0 || boundaryCondition == 0) - tmp = true; - } - - - double value = sign(u[0]) * u.absMax(); - - if(tmp) - {} - - - //north - 1, east - 2, west - 4, south - 8 - else if(boundaryCondition == 4) - { - for(int i = 0; i < this->n; i++) - for(int j = 1;j < this->n; j++) - //if(fabs(u[i*this->n + j]) < fabs(u[i*this->n])) - u[i*this->n + j] = value;// u[i*this->n]; - } - else if(boundaryCondition == 2) - { - for(int i = 0; i < this->n; i++) - for(int j =0 ;j < this->n -1; j++) - //if(fabs(u[i*this->n + j]) < fabs(u[(i+1)*this->n - 1])) - u[i*this->n + j] = value;// u[(i+1)*this->n - 1]; - } - else if(boundaryCondition == 1) - { - for(int j = 0; j < this->n; j++) - for(int i = 0;i < this->n - 1; i++) - //if(fabs(u[i*this->n + j]) < fabs(u[j + this->n*(this->n - 1)])) - u[i*this->n + j] = value;// u[j + this->n*(this->n - 1)]; - } - else if(boundaryCondition == 8) - { - for(int j = 0; j < this->n; j++) - for(int i = 1;i < this->n; i++) - //if(fabs(u[i*this->n + j]) < fabs(u[j])) - u[i*this->n + j] = value;// u[j]; - } - - - - double time = 0.0; - double currentTau = this->tau0; - double finalTime = this->stopTime;// + 3.0*(u.max() - u.min()); - if( time + currentTau > finalTime ) currentTau = finalTime - time; - - double maxResidue( 1.0 ); - tnlGridEntity<MeshType, 2, tnlGridEntityNoStencilStorage > Entity(subMesh); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - - for( int i = 0; i < u.getSize(); i ++ ) - { - if(map[i] == 0.0) - { - u[i] = /*sign(u[l])**/MAP_SOLVER_MAX_VALUE; - } - } - - while( time < finalTime ) - { - /**** - * Compute the RHS - */ - - for( int i = 0; i < fu.getSize(); i ++ ) - { - Entity.setCoordinates(Containers::StaticVector<2,int>(i % subMesh.getDimensions().x(),i / subMesh.getDimensions().x())); - Entity.refresh(); - neighborEntities.refresh(subMesh,Entity.getIndex()); - if(map[i] != 0.0) - fu[ i ] = schemeHost.getValue( this->subMesh, i, Containers::StaticVector<2,int>(i % subMesh.getDimensions().x(),i / subMesh.getDimensions().x()), u, time, boundaryCondition,neighborEntities,map); - } - maxResidue = fu. absMax(); - - - if(maxResidue != 0.0) - currentTau = fabs(this -> cflCondition / maxResidue); - - - if(currentTau > 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >()) - { - currentTau = 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - - - if( time + currentTau > finalTime ) currentTau = finalTime - time; - - - - for( int i = 0; i < fu.getSize(); i ++ ) - { - if(map[i] != 0.0) - u[ i ] += currentTau * fu[ i ]; - } - time += currentTau; - - } - return u; -} - - -#ifdef HAVE_CUDA - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgridCUDA2D( const int i ,tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller, double* a) -{ - int th = (blockIdx.y) * caller->n*caller->n*caller->gridCols - + (blockIdx.x) * caller->n - + threadIdx.y * caller->n*caller->gridCols - + threadIdx.x; - - *a = caller->work_u_cuda[th]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::updateSubgridCUDA2D( const int i ,tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller, double* a) -{ - int index = (blockIdx.y) * caller->n*caller->n*caller->gridCols - + (blockIdx.x) * caller->n - + threadIdx.y * caller->n*caller->gridCols - + threadIdx.x; - - if( (fabs(caller->work_u_cuda[index]) > fabs(*a)) || (caller->unusedCell_cuda[index] == 1) ) - { - caller->work_u_cuda[index] = *a; - caller->unusedCell_cuda[index] = 0; - - } - - *a = caller->work_u_cuda[index]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::insertSubgridCUDA2D( double u, const int i ) -{ - int index = (blockIdx.y)*this->n*this->n*this->gridCols - + (blockIdx.x)*this->n - + threadIdx.y*this->n*this->gridCols - + threadIdx.x; - - if( (fabs(this->work_u_cuda[index]) > fabs(u)) || (this->unusedCell_cuda[index] == 1) ) - { - this->work_u_cuda[index] = u; - this->unusedCell_cuda[index] = 0; - - } - - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::runSubgridCUDA2D( int boundaryCondition, double* u, int subGridID) -{ - - __shared__ int tmp; - __shared__ double value; - volatile double* sharedTau = &u[blockDim.x*blockDim.y]; - double* map_local = &u[2*blockDim.x*blockDim.y]; - - int i = threadIdx.x; - int j = threadIdx.y; - int l = threadIdx.y * blockDim.x + threadIdx.x; - int gid = (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + blockDim.x*blockIdx.x + threadIdx.x; - - /* LOAD MAP */ - map_local[l]=this->map_stretched_cuda[gid]; - if(map_local[l] != 0.0) - map_local[l] = 1.0/map_local[l]; - /* LOADED */ - - bool computeFU = !((i == 0 && (boundaryCondition & 4)) or - (i == blockDim.x - 1 && (boundaryCondition & 2)) or - (j == 0 && (boundaryCondition & 8)) or - (j == blockDim.y - 1 && (boundaryCondition & 1))); - - if(l == 0) - { - tmp = 0; - int centerGID = (blockDim.y*blockIdx.y + (blockDim.y>>1))*(blockDim.x*gridDim.x) + blockDim.x*blockIdx.x + (blockDim.x>>1); - if(this->unusedCell_cuda[centerGID] == 0 || boundaryCondition == 0) - tmp = 1; - } - __syncthreads(); - - - if(tmp !=1) - { - if(computeFU) - { - if(boundaryCondition == 4) - u[l] = u[threadIdx.y * blockDim.x] ;//+ sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(threadIdx.x); - else if(boundaryCondition == 2) - u[l] = u[threadIdx.y * blockDim.x + blockDim.x - 1] ;//+ sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(this->n - 1 - threadIdx.x); - else if(boundaryCondition == 8) - u[l] = u[threadIdx.x] ;//+ sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(threadIdx.y); - else if(boundaryCondition == 1) - u[l] = u[(blockDim.y - 1)* blockDim.x + threadIdx.x] ;//+ sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(this->n - 1 - threadIdx.y); - } - } - - double time = 0.0; - __shared__ double currentTau; - double cfl = this->cflCondition; - double fu = 0.0; - - double finalTime = this->stopTime; - if(boundaryCondition == 0) - finalTime*=2.0; - __syncthreads(); - - tnlGridEntity<MeshType, 2, tnlGridEntityNoStencilStorage > Entity(subMesh); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Entity.setCoordinates(Containers::StaticVector<2,int>(i,j)); - Entity.refresh(); - neighborEntities.refresh(subMesh,Entity.getIndex()); - - - if(map_local[l] == 0.0) - { - u[l] = /*sign(u[l])**/MAP_SOLVER_MAX_VALUE; - computeFU = false; - } - __syncthreads(); - - - while( time < finalTime ) - { - sharedTau[l] = finalTime; - - if(computeFU) - { - fu = schemeHost.getValueDev( this->subMesh, l, Containers::StaticVector<2,int>(i,j), u, time, boundaryCondition, neighborEntities, map_local); - sharedTau[l]=abs(cfl/fu); - } - - - - if(l == 0) - { - if(sharedTau[0] > 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >()) sharedTau[0] = 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - else if(l == blockDim.x*blockDim.y - 1) - if( time + sharedTau[l] > finalTime ) sharedTau[l] = finalTime - time; - - - if((blockDim.x == 16) && (l < 128)) sharedTau[l] = Min(sharedTau[l],sharedTau[l+128]); - __syncthreads(); - if((blockDim.x == 16) && (l < 64)) sharedTau[l] = Min(sharedTau[l],sharedTau[l+64]); - __syncthreads(); - if(l < 32) sharedTau[l] = Min(sharedTau[l],sharedTau[l+32]); - if(l < 16) sharedTau[l] = Min(sharedTau[l],sharedTau[l+16]); - if(l < 8) sharedTau[l] = Min(sharedTau[l],sharedTau[l+8]); - if(l < 4) sharedTau[l] = Min(sharedTau[l],sharedTau[l+4]); - if(l < 2) sharedTau[l] = Min(sharedTau[l],sharedTau[l+2]); - if(l < 1) currentTau = Min(sharedTau[l],sharedTau[l+1]); - __syncthreads(); - - u[l] += currentTau * fu; - time += currentTau; - } - - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getOwnerCUDA2D(int i) const -{ - - return ((i / (this->gridCols*this->n*this->n))*this->gridCols - + (i % (this->gridCols*this->n))/this->n); -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgridValueCUDA2D( int i ) const -{ - return this->subgridValues_cuda[i]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setSubgridValueCUDA2D(int i, int value) -{ - this->subgridValues_cuda[i] = value; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getBoundaryConditionCUDA2D( int i ) const -{ - return this->boundaryConditions_cuda[i]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setBoundaryConditionCUDA2D(int i, int value) -{ - this->boundaryConditions_cuda[i] = value; -} - - - -//north - 1, east - 2, west - 4, south - 8 - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void synchronizeCUDA2D(tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver) //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now -{ - - __shared__ int boundary[4]; // north,east,west,south - __shared__ int subgridValue; - __shared__ int newSubgridValue; - - - int gid = (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + blockDim.x*blockIdx.x + threadIdx.x; - double u = cudaSolver->work_u_cuda[gid]; - double u_cmp; - int subgridValue_cmp=INT_MAX; - int boundary_index=0; - - - if(threadIdx.x+threadIdx.y == 0) - { - subgridValue = cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x); - boundary[0] = 0; - boundary[1] = 0; - boundary[2] = 0; - boundary[3] = 0; - newSubgridValue = 0; - } - __syncthreads(); - - - - if( (threadIdx.x == 0 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.y == 0 /* && (cudaSolver->currentStep & 1)*/) || - (threadIdx.x == blockDim.x - 1 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.y == blockDim.y - 1 /* && (cudaSolver->currentStep & 1)*/) ) - { - if(threadIdx.x == 0 && (blockIdx.x != 0)/* && !(cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - 1]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x - 1); - boundary_index = 2; - } - - if(threadIdx.x == blockDim.x - 1 && (blockIdx.x != gridDim.x - 1)/* && !(cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + 1]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x + 1); - boundary_index = 1; - } - - __threadfence(); - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - u=u_cmp; - } - __threadfence(); - if(threadIdx.y == 0 && (blockIdx.y != 0)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - blockDim.x*gridDim.x]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D((blockIdx.y - 1)*gridDim.x + blockIdx.x); - boundary_index = 3; - } - if(threadIdx.y == blockDim.y - 1 && (blockIdx.y != gridDim.y - 1)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + blockDim.x*gridDim.x]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D((blockIdx.y + 1)*gridDim.x + blockIdx.x); - boundary_index = 0; - } - - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - } - } - __threadfence(); - __syncthreads(); - - if(threadIdx.x+threadIdx.y == 0) - { - if(subgridValue == INT_MAX && newSubgridValue !=0) - cudaSolver->setSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, -INT_MAX); - - cudaSolver->setBoundaryConditionCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, boundary[0] + - 2 * boundary[1] + - 4 * boundary[2] + - 8 * boundary[3]); - - - if(blockIdx.x+blockIdx.y ==0) - { - cudaSolver->currentStep += 1; - *(cudaSolver->runcuda) = 0; - } - } - -} - - - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void synchronize2CUDA2D(tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver) -{ - - - int stepValue = cudaSolver->currentStep + 4; - if( cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x) == -INT_MAX ) - cudaSolver->setSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, stepValue); - - atomicMax((cudaSolver->runcuda),cudaSolver->getBoundaryConditionCUDA2D(blockIdx.y*gridDim.x + blockIdx.x)); -} - - - - - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void initCUDA2D( tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver, double* ptr , int* ptr2, int* ptr3, double* tmp_map_ptr) -{ - - - cudaSolver->work_u_cuda = ptr; - cudaSolver->map_stretched_cuda = tmp_map_ptr; - cudaSolver->unusedCell_cuda = ptr3; - cudaSolver->subgridValues_cuda =(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*sizeof(int)); - cudaSolver->boundaryConditions_cuda =(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*sizeof(int)); - cudaSolver->runcuda = ptr2; - *(cudaSolver->runcuda) = 1; - -/* CHANGED !!!!!! from 1 to 0*/ cudaSolver->currentStep = 0; - - printf("GPU memory allocated.\n"); - - for(int i = 0; i < cudaSolver->gridCols*cudaSolver->gridRows; i++) - { - cudaSolver->subgridValues_cuda[i] = INT_MAX; - cudaSolver->boundaryConditions_cuda[i] = 0; - } - - printf("GPU memory initialized.\n"); -} - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device > -__global__ -void initRunCUDA2D(tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller) - -{ - extern __shared__ double u[]; - - int i = blockIdx.y * gridDim.x + blockIdx.x; - int l = threadIdx.y * blockDim.x + threadIdx.x; - - __shared__ int containsCurve; - if(l == 0) - containsCurve = 0; - - - caller->getSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - - if(u[0] * u[l] <= 0.0) - atomicMax( &containsCurve, 1); - - __syncthreads(); - if(containsCurve == 1) - { - caller->runSubgridCUDA2D(0,u,i); - caller->insertSubgridCUDA2D(u[l],i); - __syncthreads(); - if(l == 0) - caller->setSubgridValueCUDA2D(i, 4); - } - - -} - - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device > -__global__ -void runCUDA2D(tnlParallelMapSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller) -{ - extern __shared__ double u[]; - int i = blockIdx.y * gridDim.x + blockIdx.x; - int l = threadIdx.y * blockDim.x + threadIdx.x; - int bound = caller->getBoundaryConditionCUDA2D(i); - - if(caller->getSubgridValueCUDA2D(i) != INT_MAX && bound != 0 && caller->getSubgridValueCUDA2D(i) > 0) - { - caller->getSubgridCUDA2D(i,caller, &u[l]); - - - if(caller->getSubgridValueCUDA2D(i) == caller->currentStep+4) - { - if(bound & 1) - { - caller->runSubgridCUDA2D(1,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 2) - { - caller->runSubgridCUDA2D(2,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 4) - { - caller->runSubgridCUDA2D(4,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 8) - { - caller->runSubgridCUDA2D(8,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - } - else - { - - if(bound == 1) - { - caller->runSubgridCUDA2D(1,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound == 2) - { - caller->runSubgridCUDA2D(2,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound == 4) - { - caller->runSubgridCUDA2D(4,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound == 8) - { - caller->runSubgridCUDA2D(8,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - } - - if(bound & 3) - { - caller->runSubgridCUDA2D(3,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 5) - { - caller->runSubgridCUDA2D(5,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 10) - { - caller->runSubgridCUDA2D(10,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 12) - { - caller->runSubgridCUDA2D(12,u,i); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - - - if(l==0) - { - caller->setBoundaryConditionCUDA2D(i, 0); - caller->setSubgridValueCUDA2D(i, caller->getSubgridValueCUDA2D(i) - 1 ); - } - - - } - - - -} - -#endif /*HAVE_CUDA*/ - -#endif /* TNLPARALLELMAPSOLVER2D_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/CMakeLists.txt b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/CMakeLists.txt deleted file mode 100644 index f6a00127c7f79344a0c9303c1a0f4b2a8ad84832..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -set( tnl_hamilton_jacobi_parallel_SOURCES -# MainBuildConfig.h -# tnlParallelEikonalSolver2D_impl.h -# tnlParallelEikonalSolver3D_impl.h -# tnlParallelEikonalSolver.h -# parallelEikonalConfig.h - main.cpp) - - -IF( BUILD_CUDA ) - CUDA_ADD_EXECUTABLE(hamilton-jacobi-parallel main.cu) -ELSE( BUILD_CUDA ) - ADD_EXECUTABLE(hamilton-jacobi-parallel main.cpp) -ENDIF( BUILD_CUDA ) -target_link_libraries (hamilton-jacobi-parallel tnl ) - - -INSTALL( TARGETS hamilton-jacobi-parallel - RUNTIME DESTINATION bin - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) - -#INSTALL( FILES ${tnl_hamilton_jacobi_parallel_SOURCES} -# DESTINATION ${TNL_TARGET_DATA_DIRECTORY}/examples/hamilton-jacobi-parallel ) diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/MainBuildConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/MainBuildConfig.h deleted file mode 100644 index ed3d686eb99379af1589d734eac9b5812cccdedf..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/MainBuildConfig.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - MainBuildConfig.h - description - ------------------- - begin : Jul 7, 2014 - copyright : (C) 2014 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef MAINBUILDCONFIG_H_ -#define MAINBUILDCONFIG_H_ - -#include <solvers/tnlBuildConfigTags.h> - -class MainBuildConfig -{ - public: - - static void print() {std::cerr << "MainBuildConfig" <<std::endl; } -}; - -/**** - * Turn off support for float and long double. - */ -template<> struct tnlConfigTagReal< MainBuildConfig, float > { enum { enabled = false }; }; -template<> struct tnlConfigTagReal< MainBuildConfig, long double > { enum { enabled = false }; }; - -/**** - * Turn off support for short int and long int indexing. - */ -template<> struct tnlConfigTagIndex< MainBuildConfig, short int >{ enum { enabled = false }; }; -template<> struct tnlConfigTagIndex< MainBuildConfig, long int >{ enum { enabled = false }; }; - -/**** - * Use of tnlGrid is enabled for allowed dimensions and Real, Device and Index types. - */ -template< int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< MainBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< MainBuildConfig, Dimensions >::enabled && - tnlConfigTagReal< MainBuildConfig, Real >::enabled && - tnlConfigTagDevice< MainBuildConfig, Device >::enabled && - tnlConfigTagIndex< MainBuildConfig, Index >::enabled }; }; - -/**** - * Please, chose your preferred time discretisation here. - */ -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = false}; }; -template<> struct tnlConfigTagTimeDiscretisation< MainBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; - -/**** - * Only the Runge-Kutta-Merson solver is enabled by default. - */ -template<> struct tnlConfigTagExplicitSolver< MainBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; - -#endif /* MAINBUILDCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.cpp b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.cpp deleted file mode 100644 index b13498e17330fae7bb00a0bdc2abcc7a19f8e7a8..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cpp - description - ------------------- - begin : Jul 8 , 2014 - copyright : (C) 2014 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.cu b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.cu deleted file mode 100644 index 7101976712e153d73c5f0979b211164a36ec648d..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.cu +++ /dev/null @@ -1,17 +0,0 @@ -/*************************************************************************** - main.cu - description - ------------------- - begin : Mar 30 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "main.h" diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.h deleted file mode 100644 index dbaebdcebd3b2bdf0509eda61729c1b11579716a..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/main.h +++ /dev/null @@ -1,142 +0,0 @@ -/*************************************************************************** - main.h - description - ------------------- - begin : Mar 30 , 2015 - copyright : (C) 2015 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "tnlParallelEikonalSolver.h" -#include "parallelEikonalConfig.h" -#include "MainBuildConfig.h" -#include <solvers/tnlBuildConfigTags.h> -#include <operators/hamilton-jacobi/godunov-eikonal/parallelGodunovEikonal.h> -#include <mesh/tnlGrid.h> -#include <core/tnlDevice.h> -#include <time.h> -#include <ctime> - -typedef MainBuildConfig BuildConfig; - -int main( int argc, char* argv[] ) -{ - time_t start; - time_t stop; - time(&start); - std::clock_t start2= std::clock(); - Config::ParameterContainer parameters; - tnlConfigDescription configDescription; - parallelEikonalConfig< BuildConfig >::configSetup( configDescription ); - - if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) - return false; - - //if (parameters.GetParameter <String>("scheme") == "godunov") - //{ - tnlDeviceEnum device; - device = TNL::Devices::HostDevice; - - const int& dim = parameters.getParameter< int >( "dim" ); - - if(dim == 2) - { - - typedef parallelGodunovEikonalScheme< tnlGrid<2,double,TNL::Devices::Host, int>, double, int > SchemeTypeHost; - /*#ifdef HAVE_CUDA - typedef parallelGodunovEikonalScheme< tnlGrid<2,double,tnlCuda, int>, double, int > SchemeTypeDevice; - #endif - #ifndef HAVE_CUDA*/ - typedef parallelGodunovEikonalScheme< tnlGrid<2,double,TNL::Devices::Host, int>, double, int > SchemeTypeDevice; - /*#endif*/ - - if(device==TNL::Devices::HostDevice) - { - typedef TNL::Devices::Host Device; - - - tnlParallelEikonalSolver<2,SchemeTypeHost,SchemeTypeDevice, Device> solver; - if(!solver.init(parameters)) - { - std::cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver loop..." <<std::endl; - solver.run(); - } - else if(device==tnlCudaDevice ) - { - typedef tnlCuda Device; - //typedef parallelGodunovEikonalScheme< tnlGrid<2,double,Device, int>, double, int > SchemeType; - - tnlParallelEikonalSolver<2,SchemeTypeHost,SchemeTypeDevice, Device> solver; - if(!solver.init(parameters)) - { - std::cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver loop..." <<std::endl; - solver.run(); - } - // } - } - else if(dim == 3) - { - - typedef parallelGodunovEikonalScheme< tnlGrid<3,double,TNL::Devices::Host, int>, double, int > SchemeTypeHost; - /*#ifdef HAVE_CUDA - typedef parallelGodunovEikonalScheme< tnlGrid<2,double,tnlCuda, int>, double, int > SchemeTypeDevice; - #endif - #ifndef HAVE_CUDA*/ - typedef parallelGodunovEikonalScheme< tnlGrid<3,double,TNL::Devices::Host, int>, double, int > SchemeTypeDevice; - /*#endif*/ - - if(device==TNL::Devices::HostDevice) - { - typedef TNL::Devices::Host Device; - - - tnlParallelEikonalSolver<3,SchemeTypeHost,SchemeTypeDevice, Device> solver; - if(!solver.init(parameters)) - { - std::cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver loop..." <<std::endl; - solver.run(); - } - else if(device==tnlCudaDevice ) - { - typedef tnlCuda Device; - //typedef parallelGodunovEikonalScheme< tnlGrid<2,double,Device, int>, double, int > SchemeType; - - tnlParallelEikonalSolver<3,SchemeTypeHost,SchemeTypeDevice, Device> solver; - if(!solver.init(parameters)) - { - std::cerr << "Solver failed to initialize." <<std::endl; - return EXIT_FAILURE; - } - std::cout << "-------------------------------------------------------------" <<std::endl; - std::cout << "Starting solver loop..." <<std::endl; - solver.run(); - } - // } - } - - time(&stop); - std::cout <<std::endl; - std::cout << "Running time was: " << difftime(stop,start) << " .... " << (std::clock() - start2) / (double)(CLOCKS_PER_SEC) <<std::endl; - return EXIT_SUCCESS; -} - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/no-Makefile b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/no-Makefile deleted file mode 100644 index bfdc1ef236ca02ecfe6bc88f81d872e9524ec621..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/no-Makefile +++ /dev/null @@ -1,41 +0,0 @@ -TNL_VERSION=0.1 -TNL_INSTALL_DIR=${HOME}/local/lib -TNL_INCLUDE_DIR=${HOME}/local/include/tnl-${TNL_VERSION} - -TARGET = hamiltonJacobiParallelSolver -#CONFIG_FILE = $(TARGET).cfg.desc -INSTALL_DIR = ${HOME}/local -CXX = g++ -CUDA_CXX = nvcc -OMP_FLAGS = -DHAVE_OPENMP -fopenmp -CXX_FLAGS = -std=gnu++0x -I$(TNL_INCLUDE_DIR) -O3 $(OMP_FLAGS) -DDEBUG -LD_FLAGS = -L$(TNL_INSTALL_DIR) -ltnl-0.1 -lgomp - -SOURCES = main.cpp -HEADERS = -OBJECTS = main.o -DIST = $(SOURCES) Makefile - -all: $(TARGET) -clean: - rm -f $(OBJECTS) - rm -f $(TARGET)-conf.h - -dist: $(DIST) - tar zcvf $(TARGET).tgz $(DIST) - -install: $(TARGET) - cp $(TARGET) $(INSTALL_DIR)/bin - cp $(CONFIG_FILE) $(INSTALL_DIR)/share - -uninstall: $(TARGET) - rm -f $(INSTALL_DIR)/bin/$(TARGET) - rm -f $(CONFIG_FILE) $(INSTALL_DIR)/share - -$(TARGET): $(OBJECTS) - $(CXX) -o $(TARGET) $(OBJECTS) $(LD_FLAGS) - -%.o: %.cpp $(HEADERS) - $(CXX) -c -o $@ $(CXX_FLAGS) $< - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/parallelEikonalConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/parallelEikonalConfig.h deleted file mode 100644 index c27f5ebb39e5c4db31ed13d1a8e80b8ca8915d51..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/parallelEikonalConfig.h +++ /dev/null @@ -1,46 +0,0 @@ -/*************************************************************************** - parallelEikonalConfig.h - description - ------------------- - begin : Oct 5, 2014 - copyright : (C) 2014 by Tomas Sobotik - email : - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef HAMILTONJACOBIPARALLELEIKONALPROBLEMCONFIG_H_ -#define HAMILTONJACOBIPARALLELEIKONALPROBLEMCONFIG_H_ - -#include <config/tnlConfigDescription.h> - -template< typename ConfigTag > -class parallelEikonalConfig -{ - public: - static void configSetup( tnlConfigDescription& config ) - { - config.addDelimiter( "Parallel Eikonal solver settings:" ); - config.addEntry < String > ( "problem-name", "This defines particular problem.", "hamilton-jacobi-parallel" ); - config.addEntry < String > ( "scheme", "This defines scheme used for discretization.", "godunov" ); - config.addEntryEnum( "godunov" ); - config.addEntryEnum( "upwind" ); - config.addRequiredEntry < String > ( "initial-condition", "Initial condition for solver"); - config.addEntry < String > ( "mesh", "Name of mesh.", "mesh.tnl" ); - config.addEntry < double > ( "epsilon", "This defines epsilon for smoothening of sign().", 0.0 ); - config.addEntry < double > ( "delta", " Allowed difference on subgrid boundaries", 0.0 ); - config.addRequiredEntry < double > ( "stop-time", " Final time for solver"); - config.addRequiredEntry < double > ( "initial-tau", " initial tau for solver" ); - config.addEntry < double > ( "cfl-condition", " CFL condition", 0.0 ); - config.addEntry < int > ( "subgrid-size", "Subgrid size.", 16 ); - config.addRequiredEntry < int > ( "dim", "Dimension of problem."); - } -}; - -#endif /* HAMILTONJACOBIPARALLELEIKONALPROBLEMCONFIG_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/run b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/run deleted file mode 100755 index 3aece294a9c1189cd885acbe459dba20be713716..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/run +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -#GRID_SIZES="0897" -GRID_SIZES="0008 0015 0029 0057 0113 0225 0449" -#GRID_SIZES="1793" - -dimensions=2 - -size=2 - -time=3 - -for grid_size in $GRID_SIZES; - -do - - rm -r grid-${grid_size} - mkdir grid-${grid_size} - cd grid-${grid_size} - - tnl-grid-setup --dimensions $dimensions \ - --origin-x -1.0 \ - --origin-y -1.0 \ - --origin-z -1.0 \ - --proportions-x $size \ - --proportions-y $size \ - --proportions-z $size \ - --size-x ${grid_size} \ - --size-y ${grid_size} \ - --size-z ${grid_size} - - tnl-init --test-function sdf-para \ - --offset 0.25 \ - --output-file init.tnl \ - --final-time 0.0 \ - --snapshot-period 0.1 \ - - - tnl-init --test-function sdf-para-sdf \ - --offset 0.25 \ - --output-file sdf.tnl \ - --final-time 0.0 \ - --snapshot-period 0.1 - - hamilton-jacobi-parallel --initial-condition init.tnl \ - --cfl-condition 1.0e-1 \ - --mesh mesh.tnl \ - --initial-tau 1.0e-3 \ - --epsilon 1.0 \ - --delta 0.0 \ - --stop-time $time \ - --scheme godunov \ - --subgrid-size 8 - - tnl-diff --mesh mesh.tnl --mode sequence --input-files sdf.tnl u-00001.tnl --write-difference yes --output-file ../${grid_size}.diff - - cd .. - -done - - -./tnl-err2eoc-2.py --format txt --size $size *.diff - - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnl-err2eoc-2.py b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnl-err2eoc-2.py deleted file mode 100755 index f8cde3768e9b76156507e133f8bc3ecaa526fc71..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnl-err2eoc-2.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python - -import sys, string, math - -arguments = sys. argv[1:] -format = "txt" -output_file_name = "eoc-table.txt" -input_files = [] -verbose = 1 -size = 1.0 - -i = 0 -while i < len( arguments ): - if arguments[ i ] == "--format": - format = arguments[ i + 1 ] - i = i + 2 - continue - if arguments[ i ] == "--output-file": - output_file_name = arguments[ i + 1 ] - i = i + 2 - continue - if arguments[ i ] == "--verbose": - verbose = float( arguments[ i + 1 ] ) - i = i +2 - continue - if arguments[ i ] == "--size": - size = float( arguments[ i + 1 ] ) - i = i +2 - continue - input_files. append( arguments[ i ] ) - i = i + 1 - -if not verbose == 0: - print "Writing to " + output_file_name + " in " + format + "." - -h_list = [] -l1_norm_list = [] -l2_norm_list = [] -max_norm_list = [] -items = 0 - -for file_name in input_files: - if not verbose == 0: - print "Processing file " + file_name - file = open( file_name, "r" ) - - l1_max = 0.0 - l_max_max = 0.0 - file.readline(); - file.readline(); - for line in file. readlines(): - data = string. split( line ) - h_list. append( size/(float(file_name[0:len(file_name)-5] ) - 1.0) ) - l1_norm_list. append( float( data[ 1 ] ) ) - l2_norm_list. append( float( data[ 2 ] ) ) - max_norm_list. append( float( data[ 3 ] ) ) - items = items + 1 - if not verbose == 0: - print line - file. close() - -h_width = 12 -err_width = 15 -file = open( output_file_name, "w" ) -if format == "latex": - file. write( "\\begin{tabular}{|r|l|l|l|l|l|l|}\\hline\n" ) - file. write( "\\raisebox{-1ex}[0ex]{$h$}& \n" ) - file. write( "\\multicolumn{2}{|c|}{\\raisebox{1ex}[3.5ex]{$\\left\| \\cdot \\right\\|_{L_1\\left(\\omega_h;\\left[0,T\\right]\\right)}^{h,\\tau}$}}& \n" ) - file. write( "\\multicolumn{2}{|c|}{\\raisebox{1ex}[3.5ex]{$\\left\| \\cdot \\right\\|_{L_2\\left(\\omega_h;\left[0,T\\right]\\right)}^{h,\\tau}$}}& \n" ) - file. write( "\\multicolumn{2}{|c|}{\\raisebox{1ex}[3.5ex]{$\\left\| \\cdot \\right\\|_{L_\\infty\\left(\\omega_h;\\left[0,T\\right]\\right)}^{h,\\tau}$}}\\\\ \\cline{2-7} \n" ) - file. write( " " + string. rjust( " ", h_width ) + "&" + - string. rjust( "Error", err_width ) + "&" + - string. rjust( "{\\bf EOC}", err_width ) + "&" + - string. rjust( "Error", err_width ) + "&" + - string. rjust( "{\\bf EOC}", err_width ) + "&" + - string. rjust( "Error.", err_width ) + "&" + - string. rjust( "{\\bf EOC}", err_width ) + - "\\\\ \\hline \\hline \n") -if format == "txt": - file. write( "+--------------+----------------+----------------+----------------+----------------+----------------+----------------+\n" ) - file. write( "| h | L1 Err. | L1 EOC. | L2 Err. | L2 EOC | MAX Err. | MAX EOC |\n" ) - file. write( "+==============+================+================+================+================+================+================+\n" ) - - -i = 0 -while i < items: - if i == 0: - if format == "latex": - file. write( " " + string. ljust( str( h_list[ i ] ), h_width ) + "&" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + "&" + - string. rjust( " ", err_width ) + "&"+ - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + "&" + - string. rjust( " ", err_width ) + "&" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + "&" + - string. rjust( " ", err_width ) + "\\\\\n" ) - if format == "txt": - file. write( "| " + string. ljust( str( h_list[ i ] ), h_width ) + " |" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + " |" + - string. rjust( " ", err_width ) + " |" + - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + " |" + - string. rjust( " ", err_width ) + " |" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + " |" + - string. rjust( " ", err_width ) + " |\n" ) - file. write( "+--------------+----------------+----------------+----------------+----------------+----------------+----------------+\n" ) - i = i + 1; - continue - if h_list[ i ] == h_list[ i - 1 ]: - print "Unable to count eoc since h[ " + \ - str( i ) + " ] = h[ " + str( i - 1 ) + \ - " ] = " + str( h_list[ i ] ) + ". \n" - file. write( " eoc error: h[ " + \ - str( i ) + " ] = h[ " + str( i - 1 ) + \ - " ] = " + str( h_list[ i ] ) + ". \n" ) - else: - h_ratio = math. log( h_list[ i ] / h_list[ i - 1 ] ) - l1_ratio = math. log( l1_norm_list[ i ] / l1_norm_list[ i - 1 ] ) - l2_ratio = math. log( l2_norm_list[ i ] / l2_norm_list[ i - 1 ] ) - max_ratio = math. log( max_norm_list[ i ] / max_norm_list[ i - 1 ] ) - if format == "latex": - file. write( " " + string. ljust( str( h_list[ i ] ), h_width ) + "&" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + "&" + - string. rjust( "{\\bf " + "%.2g" % ( l1_ratio / h_ratio ) + "}", err_width ) + "&" + - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + "&" + - string. rjust( "{\\bf " + "%.2g" % ( l2_ratio / h_ratio ) + "}", err_width ) + "&" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + "&" + - string. rjust( "{\\bf " + "%.2g" % ( max_ratio / h_ratio ) + "}", err_width ) + "\\\\\n" ) - if format == "txt": - file. write( "| " + string. ljust( str( h_list[ i ] ), h_width ) + " |" + - string. rjust( "%.2g" % l1_norm_list[ i ], err_width ) + " |" + - string. rjust( "**" + "%.2g" % ( l1_ratio / h_ratio ) + "**", err_width ) + " |" + - string. rjust( "%.2g" % l2_norm_list[ i ], err_width ) + " |" + - string. rjust( "**" + "%.2g" % ( l2_ratio / h_ratio ) + "**", err_width ) + " |" + - string. rjust( "%.2g" % max_norm_list[ i ], err_width ) + " |" + - string. rjust( "**" + "%.2g" % ( max_ratio / h_ratio ) + "**", err_width ) + " |\n" ) - file. write( "+--------------+----------------+----------------+----------------+----------------+----------------+----------------+\n" ) - i = i + 1 - -if format == "latex": - file. write( "\\hline \n" ) - file. write( "\\end{tabular} \n" ) - diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h deleted file mode 100644 index 19cdd949359d4349172af820def49169146c8717..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver.h +++ /dev/null @@ -1,366 +0,0 @@ -/*************************************************************************** - tnlParallelEikonalSolver.h - description - ------------------- - begin : Nov 28 , 2014 - copyright : (C) 2014 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef TNLPARALLELEIKONALSOLVER_H_ -#define TNLPARALLELEIKONALSOLVER_H_ - -#include <TNL/Config/ParameterContainer.h> -#include <TNL/Containers/Vector.h> -#include <TNL/Containers/StaticVector.h> -#include <functions/tnlMeshFunction.h> -#include <TNL/Devices/Host.h> -#include <mesh/tnlGrid.h> -#include <mesh/grids/tnlGridEntity.h> -#include <limits.h> -#include <core/tnlDevice.h> - #include <omp.h> - - -#include <ctime> - -#ifdef HAVE_CUDA -#include <core/tnlCuda.h> -#endif - - -template< int Dimension, - typename SchemeHost, - typename SchemeDevice, - typename Device, - typename RealType = double, - typename IndexType = int > -class tnlParallelEikonalSolver -{}; - -template<typename SchemeHost, typename SchemeDevice, typename Device> -class tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int > -{ -public: - - typedef SchemeDevice SchemeTypeDevice; - typedef SchemeHost SchemeTypeHost; - typedef Device DeviceType; - typedef TNL::Containers::Vector< double, TNL::Devices::Host, int > VectorType; - typedef TNL::Containers::Vector< int, TNL::Devices::Host, int > IntVectorType; - typedef tnlGrid< 2, double, TNL::Devices::Host, int > MeshType; -#ifdef HAVE_CUDA - typedef TNL::Containers::Vector< double, TNL::Devices::Host, int > VectorTypeCUDA; - typedef TNL::Containers::Vector< int, TNL::Devices::Host, int > IntVectorTypeCUDA; - typedef tnlGrid< 2, double, TNL::Devices::Host, int > MeshTypeCUDA; -#endif - tnlParallelEikonalSolver(); - bool init( const Config::ParameterContainer& parameters ); - void run(); - - void test(); - -/*private:*/ - - - void synchronize(); - - int getOwner( int i) const; - - int getSubgridValue( int i ) const; - - void setSubgridValue( int i, int value ); - - int getBoundaryCondition( int i ) const; - - void setBoundaryCondition( int i, int value ); - - void stretchGrid(); - - void contractGrid(); - - VectorType getSubgrid( const int i ) const; - - void insertSubgrid( VectorType u, const int i ); - - VectorType runSubgrid( int boundaryCondition, VectorType u, int subGridID); - - - tnlMeshFunction<MeshType> u0; - VectorType work_u; - IntVectorType subgridValues, boundaryConditions, unusedCell, calculationsCount; - MeshType mesh, subMesh; - -// tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage > Entity; - - SchemeHost schemeHost; - SchemeDevice schemeDevice; - double delta, tau0, stopTime,cflCondition; - int gridRows, gridCols, gridLevels, currentStep, n; - - std::clock_t start; - double time_diff; - - - tnlDeviceEnum device; - - tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* getSelf() - { - return this; - }; - -#ifdef HAVE_CUDA - - tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver; - - double* work_u_cuda; - - int* subgridValues_cuda; - int*boundaryConditions_cuda; - int* unusedCell_cuda; - int* calculationsCount_cuda; - double* tmpw; - //MeshTypeCUDA mesh_cuda, subMesh_cuda; - //SchemeDevice scheme_cuda; - //double delta_cuda, tau0_cuda, stopTime_cuda,cflCondition_cuda; - //int gridRows_cuda, gridCols_cuda, currentStep_cuda, n_cuda; - - int* runcuda; - int run_host; - - - __device__ void getSubgridCUDA2D( const int i, tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller, double* a); - - __device__ void updateSubgridCUDA2D( const int i, tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller, double* a); - - __device__ void insertSubgridCUDA2D( double u, const int i ); - - __device__ void runSubgridCUDA2D( int boundaryCondition, double* u, int subGridID); - - /*__global__ void runCUDA();*/ - - //__device__ void synchronizeCUDA(); - - __device__ int getOwnerCUDA2D( int i) const; - - __device__ int getSubgridValueCUDA2D( int i ) const; - - __device__ void setSubgridValueCUDA2D( int i, int value ); - - __device__ int getBoundaryConditionCUDA2D( int i ) const; - - __device__ void setBoundaryConditionCUDA2D( int i, int value ); - - //__device__ bool initCUDA( tnlParallelEikonalSolver<SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - - /*__global__ void initRunCUDA(tnlParallelEikonalSolver<Scheme, double, TNL::Devices::Host, int >* caller);*/ - -#endif - -}; - - - - - - - - template<typename SchemeHost, typename SchemeDevice, typename Device> - class tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int > - { - public: - - typedef SchemeDevice SchemeTypeDevice; - typedef SchemeHost SchemeTypeHost; - typedef Device DeviceType; - typedef TNL::Containers::Vector< double, TNL::Devices::Host, int > VectorType; - typedef TNL::Containers::Vector< int, TNL::Devices::Host, int > IntVectorType; - typedef tnlGrid< 3, double, TNL::Devices::Host, int > MeshType; - #ifdef HAVE_CUDA - typedef TNL::Containers::Vector< double, TNL::Devices::Host, int > VectorTypeCUDA; - typedef TNL::Containers::Vector< int, TNL::Devices::Host, int > IntVectorTypeCUDA; - typedef tnlGrid< 3, double, TNL::Devices::Host, int > MeshTypeCUDA; - #endif - tnlParallelEikonalSolver(); - bool init( const Config::ParameterContainer& parameters ); - void run(); - - void test(); - - /*private:*/ - - - void synchronize(); - - int getOwner( int i) const; - - int getSubgridValue( int i ) const; - - void setSubgridValue( int i, int value ); - - int getBoundaryCondition( int i ) const; - - void setBoundaryCondition( int i, int value ); - - void stretchGrid(); - - void contractGrid(); - - VectorType getSubgrid( const int i ) const; - - void insertSubgrid( VectorType u, const int i ); - - VectorType runSubgrid( int boundaryCondition, VectorType u, int subGridID); - - - tnlMeshFunction<MeshType> u0; - VectorType work_u; - IntVectorType subgridValues, boundaryConditions, unusedCell, calculationsCount; - MeshType mesh, subMesh; - SchemeHost schemeHost; - SchemeDevice schemeDevice; - double delta, tau0, stopTime,cflCondition; - int gridRows, gridCols, gridLevels, currentStep, n; - - std::clock_t start; - double time_diff; - - - tnlDeviceEnum device; - - tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* getSelf() - { - return this; - }; - -#ifdef HAVE_CUDA - - tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver; - - double* work_u_cuda; - - int* subgridValues_cuda; - int*boundaryConditions_cuda; - int* unusedCell_cuda; - int* calculationsCount_cuda; - double* tmpw; - //MeshTypeCUDA mesh_cuda, subMesh_cuda; - //SchemeDevice scheme_cuda; - //double delta_cuda, tau0_cuda, stopTime_cuda,cflCondition_cuda; - //int gridRows_cuda, gridCols_cuda, currentStep_cuda, n_cuda; - - int* runcuda; - int run_host; - - - __device__ void getSubgridCUDA3D( const int i, tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* caller, double* a); - - __device__ void updateSubgridCUDA3D( const int i, tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* caller, double* a); - - __device__ void insertSubgridCUDA3D( double u, const int i ); - - __device__ void runSubgridCUDA3D( int boundaryCondition, double* u, int subGridID); - - /*__global__ void runCUDA();*/ - - //__device__ void synchronizeCUDA(); - - __device__ int getOwnerCUDA3D( int i) const; - - __device__ int getSubgridValueCUDA3D( int i ) const; - - __device__ void setSubgridValueCUDA3D( int i, int value ); - - __device__ int getBoundaryConditionCUDA3D( int i ) const; - - __device__ void setBoundaryConditionCUDA3D( int i, int value ); - - //__device__ bool initCUDA( tnlParallelEikonalSolver<SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - - /*__global__ void initRunCUDA(tnlParallelEikonalSolver<Scheme, double, TNL::Devices::Host, int >* caller);*/ - -#endif - -}; - - - - - - -#ifdef HAVE_CUDA -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void runCUDA2D(tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void initRunCUDA2D(tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* caller); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void initCUDA2D( tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver, double* ptr, int * ptr2, int* ptr3); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void synchronizeCUDA2D(tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void synchronize2CUDA2D(tnlParallelEikonalSolver<2, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - - - - - - - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void runCUDA3D(tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* caller); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void initRunCUDA3D(tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* caller); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void initCUDA3D( tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver, double* ptr, int * ptr2, int* ptr3); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void synchronizeCUDA3D(tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ void synchronize2CUDA3D(tnlParallelEikonalSolver<3, SchemeHost, SchemeDevice, Device, double, int >* cudaSolver); -#endif - - -#ifdef HAVE_CUDA -__cuda_callable__ -double fabsMin( double x, double y) -{ - double fx = fabs(x); - - if(Min(fx,fabs(y)) == fx) - return x; - else - return y; -} - -__cuda_callable__ -double atomicFabsMin(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed,__double_as_longlong( fabsMin(__longlong_as_double(assumed),val) )); - } while (assumed != old); - return __longlong_as_double(old); -} - -#endif - -#include "tnlParallelEikonalSolver2D_impl.h" -#include "tnlParallelEikonalSolver3D_impl.h" -#endif /* TNLPARALLELEIKONALSOLVER_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver2D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver2D_impl.h deleted file mode 100644 index 76cf49bc8aa28890d598fe010aa777acb2c6edfd..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver2D_impl.h +++ /dev/null @@ -1,1928 +0,0 @@ -/*************************************************************************** - tnlParallelEikonalSolver2D_impl.h - description - ------------------- - begin : Nov 28 , 2014 - copyright : (C) 2014 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef TNLPARALLELEIKONALSOLVER2D_IMPL_H_ -#define TNLPARALLELEIKONALSOLVER2D_IMPL_H_ - - -#include "tnlParallelEikonalSolver.h" -#include <core/mfilename.h> - -template< typename SchemeHost, typename SchemeDevice, typename Device> -tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::tnlParallelEikonalSolver() -{ - cout << "a" <<std::endl; - this->device = tnlCudaDevice; /////////////// tnlCuda Device --- vypocet na GPU, TNL::Devices::HostDevice --- vypocet na CPU - -#ifdef HAVE_CUDA - if(this->device == tnlCudaDevice) - { - run_host = 1; - } -#endif - - cout << "b" <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::test() -{ -/* - for(int i =0; i < this->subgridValues.getSize(); i++ ) - { - insertSubgrid(getSubgrid(i), i); - } -*/ -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> - -bool tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::init( const Config::ParameterContainer& parameters ) -{ - cout << "Initializating solver..." <<std::endl; - const String& meshLocation = parameters.getParameter <String>("mesh"); - this->mesh.load( meshLocation ); - - this->n = parameters.getParameter <int>("subgrid-size"); - cout << "Setting N to " << this->n <<std::endl; - - this->subMesh.setDimensions( this->n, this->n ); - this->subMesh.setDomain( Containers::StaticVector<2,double>(0.0, 0.0), - Containers::StaticVector<2,double>(mesh.template getSpaceStepsProducts< 1, 0 >()*(double)(this->n), mesh.template getSpaceStepsProducts< 0, 1 >()*(double)(this->n)) ); - - this->subMesh.save("submesh.tnl"); - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - this->u0.load( initialCondition ); - - //cout << this->mesh.getCellCenter(0) <<std::endl; - - this->delta = parameters.getParameter <double>("delta"); - this->delta *= mesh.template getSpaceStepsProducts< 1, 0 >()*mesh.template getSpaceStepsProducts< 0, 1 >(); - - cout << "Setting delta to " << this->delta <<std::endl; - - this->tau0 = parameters.getParameter <double>("initial-tau"); - cout << "Setting initial tau to " << this->tau0 <<std::endl; - this->stopTime = parameters.getParameter <double>("stop-time"); - - this->cflCondition = parameters.getParameter <double>("cfl-condition"); - this -> cflCondition *= sqrt(mesh.template getSpaceStepsProducts< 1, 0 >()*mesh.template getSpaceStepsProducts< 0, 1 >()); - cout << "Setting CFL to " << this->cflCondition <<std::endl; - - stretchGrid(); - this->stopTime /= (double)(this->gridCols); - this->stopTime *= (1.0+1.0/((double)(this->n) - 2.0)); - cout << "Setting stopping time to " << this->stopTime <<std::endl; - //this->stopTime = 1.5*((double)(this->n))*parameters.getParameter <double>("stop-time")*this->mesh.template getSpaceStepsProducts< 1, 0 >(); - //cout << "Setting stopping time to " << this->stopTime <<std::endl; - - cout << "Initializating scheme..." <<std::endl; - if(!this->schemeHost.init(parameters)) - { - cerr << "SchemeHost failed to initialize." <<std::endl; - return false; - } - cout << "Scheme initialized." <<std::endl; - - test(); - - VectorType* tmp = new VectorType[subgridValues.getSize()]; - bool containsCurve = false; - -#ifdef HAVE_CUDA - - if(this->device == tnlCudaDevice) - { - /*cout << "Testing... " <<std::endl; - if(this->device == tnlCudaDevice) - { - if( !initCUDA2D(parameters, gridRows, gridCols) ) - return false; - }*/ - //cout << "s" <<std::endl; - cudaMalloc(&(this->cudaSolver), sizeof(tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >)); - //cout << "s" <<std::endl; - cudaMemcpy(this->cudaSolver, this,sizeof(tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >), cudaMemcpyHostToDevice); - //cout << "s" <<std::endl; - double** tmpdev = NULL; - cudaMalloc(&tmpdev, sizeof(double*)); - //double* tmpw; - cudaMalloc(&(this->tmpw), this->work_u.getSize()*sizeof(double)); - cudaMalloc(&(this->runcuda), sizeof(int)); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - int* tmpUC; - cudaMalloc(&(tmpUC), this->work_u.getSize()*sizeof(int)); - cudaMemcpy(tmpUC, this->unusedCell.getData(), this->unusedCell.getSize()*sizeof(int), cudaMemcpyHostToDevice); - - initCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<1,1>>>(this->cudaSolver, (this->tmpw), (this->runcuda),tmpUC); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << "s " <<std::endl; - //cudaMalloc(&(cudaSolver->work_u_cuda), this->work_u.getSize()*sizeof(double)); - double* tmpu = NULL; - - cudaMemcpy(&tmpu, tmpdev,sizeof(double*), cudaMemcpyDeviceToHost); - //printf("%p %p \n",tmpu,tmpw); - cudaMemcpy((this->tmpw), this->work_u.getData(), this->work_u.getSize()*sizeof(double), cudaMemcpyHostToDevice); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << "s "<<std::endl; - - } -#endif - - if(this->device == TNL::Devices::HostDevice) - { - for(int i = 0; i < this->subgridValues.getSize(); i++) - { - - if(! tmp[i].setSize(this->n * this->n)) - cout << "Could not allocate tmp["<< i <<"] array." <<std::endl; - tmp[i] = getSubgrid(i); - containsCurve = false; - - for(int j = 0; j < tmp[i].getSize(); j++) - { - if(tmp[i][0]*tmp[i][j] <= 0.0) - { - containsCurve = true; - j=tmp[i].getSize(); - } - - } - if(containsCurve) - { - //cout << "Computing initial SDF on subgrid " << i << "." <<std::endl; - tmp[i] = runSubgrid(0, tmp[i],i); - insertSubgrid(tmp[i], i); - setSubgridValue(i, 4); - //cout << "Computed initial SDF on subgrid " << i << "." <<std::endl; - } - containsCurve = false; - - } - } -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { -// cout << "pre 1 kernel" <<std::endl; - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - dim3 threadsPerBlock(this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initRunCUDA2D<SchemeTypeHost,SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock,3*this->n*this->n*sizeof(double)>>>(this->cudaSolver); - cudaDeviceSynchronize(); -// cout << "post 1 kernel" <<std::endl; - - } -#endif - - - this->currentStep = 1; - if(this->device == TNL::Devices::HostDevice) - synchronize(); -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - dim3 threadsPerBlock(this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows); - //double * test = (double*)malloc(this->work_u.getSize()*sizeof(double)); - //cout << test[0] <<" " << test[1] <<" " << test[2] <<" " << test[3] <<std::endl; - //cudaMemcpy(/*this->work_u.getData()*/ test, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //cout << this->tmpw << " " << test[0] <<" " << test[1] << " " <<test[2] << " " <<test[3] <<std::endl; - - TNL_CHECK_CUDA_DEVICE; - - synchronizeCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - synchronize2CUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << test[0] << " " <<test[1] <<" " << test[2] << " " <<test[3] <<std::endl; - //cudaMemcpy(/*this->work_u.getData()*/ test, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //TNL_CHECK_CUDA_DEVICE; - //cout << this->tmpw << " " << test[0] << " " <<test[1] << " " <<test[2] <<" " << test[3] <<std::endl; - //free(test); - - } - -#endif - cout << "Solver initialized." <<std::endl; - - return true; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::run() -{ - if(this->device == TNL::Devices::HostDevice) - { - - bool end = false; - while ((this->boundaryConditions.max() > 0 ) || !end) - { - if(this->boundaryConditions.max() == 0 ) - end=true; - else - end=false; -#ifdef HAVE_OPENMP -#pragma omp parallel for num_threads(4) schedule(dynamic) -#endif - for(int i = 0; i < this->subgridValues.getSize(); i++) - { - if(getSubgridValue(i) != INT_MAX) - { - VectorType tmp; - tmp.setSize(this->n * this->n); - //cout << "subMesh: " << i << ", BC: " << getBoundaryCondition(i) <<std::endl; - - if(getSubgridValue(i) == currentStep+4) - { - - if(getBoundaryCondition(i) & 1) - { - tmp = getSubgrid(i); - tmp = runSubgrid(1, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 2) - { - tmp = getSubgrid(i); - tmp = runSubgrid(1, tmp ,i); - insertSubgrid( tmp, 2); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 4) - { - tmp = getSubgrid(i); - tmp = runSubgrid(4, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 8) - { - tmp = getSubgrid(i); - tmp = runSubgrid(8, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - } - - if( ((getBoundaryCondition(i) & 2) )|| (getBoundaryCondition(i) & 1)//) - /* &&(!(getBoundaryCondition(i) & 5) && !(getBoundaryCondition(i) & 10)) */) - { - //cout << "3 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(1, tmp ,i); - insertSubgrid( tmp, 3); - } - if( ((getBoundaryCondition(i) & 4) )|| (getBoundaryCondition(i) & 1)//) - /* &&(!(getBoundaryCondition(i) & 3) && !(getBoundaryCondition(i) & 12)) */) - { - //cout << "5 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(5, tmp ,i); - insertSubgrid( tmp, i); - } - if( ((getBoundaryCondition(i) & 2) )|| (getBoundaryCondition(i) & 8)//) - /* &&(!(getBoundaryCondition(i) & 12) && !(getBoundaryCondition(i) & 3))*/ ) - { - //cout << "10 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(10, tmp ,i); - insertSubgrid( tmp, i); - } - if( ((getBoundaryCondition(i) & 4) )|| (getBoundaryCondition(i) & 8)//) - /*&&(!(getBoundaryCondition(i) & 10) && !(getBoundaryCondition(i) & 5)) */) - { - //cout << "12 @ " << getBoundaryCondition(i) <<std::endl; - tmp = getSubgrid(i); - tmp = runSubgrid(12, tmp ,i); - insertSubgrid( tmp, i); - } - - - /*if(getBoundaryCondition(i)) - { - insertSubgrid( runSubgrid(15, getSubgrid(i),i), i); - }*/ - - setBoundaryCondition(i, 0); - - setSubgridValue(i, getSubgridValue(i)-1); - - } - } - synchronize(); - } - } -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - //cout << "fn" <<std::endl; - bool end_cuda = false; - dim3 threadsPerBlock(this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cudaMalloc(&runcuda,sizeof(bool)); - //cudaMemcpy(runcuda, &run_host, sizeof(bool), cudaMemcpyHostToDevice); - //cout << "fn" <<std::endl; - bool* tmpb; - //cudaMemcpy(tmpb, &(cudaSolver->runcuda),sizeof(bool*), cudaMemcpyDeviceToHost); - //cudaDeviceSynchronize(); - //TNL_CHECK_CUDA_DEVICE; - cudaMemcpy(&(this->run_host),this->runcuda,sizeof(int), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << "fn" <<std::endl; - int i = 1; - time_diff = 0.0; - while (run_host || !end_cuda) - { - cout << "Computing at step "<< i++ <<std::endl; - if(run_host != 0 ) - end_cuda = true; - else - end_cuda = false; - //cout << "a" <<std::endl; - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - start = std::clock(); - runCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock,3*this->n*this->n*sizeof(double)>>>(this->cudaSolver); - //cout << "a" <<std::endl; - cudaDeviceSynchronize(); - time_diff += (std::clock() - start) / (double)(CLOCKS_PER_SEC); - - //start = std::clock(); - synchronizeCUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - synchronize2CUDA2D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //time_diff += (std::clock() - start) / (double)(CLOCKS_PER_SEC); - - - //cout << "a" <<std::endl; - //run_host = false; - //cout << "in kernel loop" << run_host <<std::endl; - //cudaMemcpy(tmpb, &(cudaSolver->runcuda),sizeof(bool*), cudaMemcpyDeviceToHost); - cudaMemcpy(&run_host, (this->runcuda),sizeof(int), cudaMemcpyDeviceToHost); - //cout << "in kernel loop" << run_host <<std::endl; - } - cout << "Solving time was: " << time_diff <<std::endl; - //cout << "b" <<std::endl; - - //double* tmpu; - //cudaMemcpy(tmpu, &(cudaSolver->work_u_cuda),sizeof(double*), cudaMemcpyHostToDevice); - //cudaMemcpy(this->work_u.getData(), tmpu, this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //cout << this->work_u.getData()[0] <<std::endl; - - //double * test = (double*)malloc(this->work_u.getSize()*sizeof(double)); - //cout << test[0] << test[1] << test[2] << test[3] <<std::endl; - cudaMemcpy(this->work_u.getData()/* test*/, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //cout << this->tmpw << " " << test[0] << test[1] << test[2] << test[3] <<std::endl; - //free(test); - - cudaDeviceSynchronize(); - } -#endif - contractGrid(); - this->u0.save("u-00001.tnl"); - cout << "Maximum number of calculations on one subgrid was " << this->calculationsCount.absMax() <<std::endl; - cout << "Average number of calculations on one subgrid was " << ( (double) this->calculationsCount.sum() / (double) this->calculationsCount.getSize() ) <<std::endl; - cout << "Solver finished" <<std::endl; - -#ifdef HAVE_CUDA - if(this->device == tnlCudaDevice) - { - cudaFree(this->runcuda); - cudaFree(this->tmpw); - cudaFree(this->cudaSolver); - } -#endif - -} - -//north - 1, east - 2, west - 4, south - 8 -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::synchronize() //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now -{ - cout << "Synchronizig..." <<std::endl; - int tmp1, tmp2; - int grid1, grid2; - - if(this->currentStep & 1) - { - for(int j = 0; j < this->gridRows - 1; j++) - { - for (int i = 0; i < this->gridCols*this->n; i++) - { - tmp1 = this->gridCols*this->n*((this->n-1)+j*this->n) + i; - tmp2 = this->gridCols*this->n*((this->n)+j*this->n) + i; - grid1 = getSubgridValue(getOwner(tmp1)); - grid2 = getSubgridValue(getOwner(tmp2)); - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j" << i << "," << j <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp2)) & 8) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+8); - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; - this->unusedCell[tmp1] = 0; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp1)) & 1) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+1); - } - } - } - - } - else - { - for(int i = 1; i < this->gridCols; i++) - { - for (int j = 0; j < this->gridRows*this->n; j++) - { - tmp1 = this->gridCols*this->n*j + i*this->n - 1; - tmp2 = this->gridCols*this->n*j + i*this->n ; - grid1 = getSubgridValue(getOwner(tmp1)); - grid2 = getSubgridValue(getOwner(tmp2)); - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j" << i << "," << j <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp2)) & 4) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+4); - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; - this->unusedCell[tmp1] = 0; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp1)) & 2) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+2); - } - } - } - } - - - this->currentStep++; - int stepValue = this->currentStep + 4; - for (int i = 0; i < this->subgridValues.getSize(); i++) - { - if( getSubgridValue(i) == -INT_MAX ) - setSubgridValue(i, stepValue); - } - - cout << "Grid synchronized at step " << (this->currentStep - 1 ) <<std::endl; - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getOwner(int i) const -{ - - return (i / (this->gridCols*this->n*this->n))*this->gridCols + (i % (this->gridCols*this->n))/this->n; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgridValue( int i ) const -{ - return this->subgridValues[i]; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setSubgridValue(int i, int value) -{ - this->subgridValues[i] = value; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getBoundaryCondition( int i ) const -{ - return this->boundaryConditions[i]; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setBoundaryCondition(int i, int value) -{ - this->boundaryConditions[i] = value; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::stretchGrid() -{ - cout << "Stretching grid..." <<std::endl; - - - this->gridCols = ceil( ((double)(this->mesh.getDimensions().x()-1)) / ((double)(this->n-1)) ); - this->gridRows = ceil( ((double)(this->mesh.getDimensions().y()-1)) / ((double)(this->n-1)) ); - - //this->gridCols = (this->mesh.getDimensions().x()-1) / (this->n-1) ; - //this->gridRows = (this->mesh.getDimensions().y()-1) / (this->n-1) ; - - cout << "Setting gridCols to " << this->gridCols << "." <<std::endl; - cout << "Setting gridRows to " << this->gridRows << "." <<std::endl; - - this->subgridValues.setSize(this->gridCols*this->gridRows); - this->subgridValues.setValue(0); - this->boundaryConditions.setSize(this->gridCols*this->gridRows); - this->boundaryConditions.setValue(0); - this->calculationsCount.setSize(this->gridCols*this->gridRows); - this->calculationsCount.setValue(0); - - for(int i = 0; i < this->subgridValues.getSize(); i++ ) - { - this->subgridValues[i] = INT_MAX; - this->boundaryConditions[i] = 0; - } - - int stretchedSize = this->n*this->n*this->gridCols*this->gridRows; - - if(!this->work_u.setSize(stretchedSize)) - cerr << "Could not allocate memory for stretched grid." <<std::endl; - if(!this->unusedCell.setSize(stretchedSize)) - cerr << "Could not allocate memory for supporting stretched grid." <<std::endl; - int idealStretch =this->mesh.getDimensions().x() + (this->mesh.getDimensions().x()-2)/(this->n-1); - cout << idealStretch <<std::endl; - - for(int i = 0; i < stretchedSize; i++) - { - this->unusedCell[i] = 1; - int diff =(this->n*this->gridCols) - idealStretch ; - //cout << "diff = " << diff <<endl; - int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)) + (i/(this->n*this->gridCols))*diff; - - if(i%(this->n*this->gridCols) - idealStretch >= 0) - { - //cout << i%(this->n*this->gridCols) - idealStretch +1 <<std::endl; - k+= i%(this->n*this->gridCols) - idealStretch +1 ; - } - - if(i/(this->n*this->gridCols) - idealStretch + 1 > 0) - { - //cout << i/(this->n*this->gridCols) - idealStretch + 1 <<std::endl; - k+= (i/(this->n*this->gridCols) - idealStretch +1 )* this->mesh.getDimensions().x() ; - } - - //cout << "i = " << i << " : i-k = " << i-k <<std::endl; - /*int j=(i % (this->n*this->gridCols)) - ( (this->mesh.getDimensions().x() - this->n)/(this->n - 1) + this->mesh.getDimensions().x() - 1) - + (this->n*this->gridCols - this->mesh.getDimensions().x())*(i/(this->n*this->n*this->gridCols)) ; - - if(j > 0) - k += j; - - int l = i-k - (this->u0.getSize() - 1); - int m = (l % this->mesh.getDimensions().x()); - - if(l>0) - k+= l + ( (l / this->mesh.getDimensions().x()) + 1 )*this->mesh.getDimensions().x() - (l % this->mesh.getDimensions().x());*/ - - this->work_u[i] = this->u0[i-k]; - //cout << (i-k) <<endl; - } - - - cout << "Grid stretched." <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::contractGrid() -{ - cout << "Contracting grid..." <<std::endl; - int stretchedSize = this->n*this->n*this->gridCols*this->gridRows; - - int idealStretch =this->mesh.getDimensions().x() + (this->mesh.getDimensions().x()-2)/(this->n-1); - cout << idealStretch <<std::endl; - - for(int i = 0; i < stretchedSize; i++) - { - int diff =(this->n*this->gridCols) - idealStretch ; - int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)) + (i/(this->n*this->gridCols))*diff; - - if((i%(this->n*this->gridCols) - idealStretch < 0) && (i/(this->n*this->gridCols) - idealStretch + 1 <= 0)) - { - //cout << i <<" : " <<i-k<<std::endl; - this->u0[i-k] = this->work_u[i]; - } - - } - - cout << "Grid contracted" <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -typename tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::VectorType -tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgrid( const int i ) const -{ - VectorType u; - u.setSize(this->n*this->n); - - for( int j = 0; j < u.getSize(); j++) - { - u[j] = this->work_u[ (i / this->gridCols) * this->n*this->n*this->gridCols - + (i % this->gridCols) * this->n - + (j/this->n) * this->n*this->gridCols - + (j % this->n) ]; - } - return u; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::insertSubgrid( VectorType u, const int i ) -{ - - for( int j = 0; j < this->n*this->n; j++) - { - int index = (i / this->gridCols)*this->n*this->n*this->gridCols - + (i % this->gridCols)*this->n - + (j/this->n)*this->n*this->gridCols - + (j % this->n); - //OMP LOCK index - if( (fabs(this->work_u[index]) > fabs(u[j])) || (this->unusedCell[index] == 1) ) - { - this->work_u[index] = u[j]; - this->unusedCell[index] = 0; - } - //OMP UNLOCK index - } -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -typename tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::VectorType -tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::runSubgrid( int boundaryCondition, VectorType u, int subGridID) -{ - - VectorType fu; - - fu.setLike(u); - fu.setValue( 0.0 ); - -/* - * Insert Euler-Solver Here - */ - - /**/ - - /*for(int i = 0; i < u.getSize(); i++) - { - int x = this->subMesh.getCellCoordinates(i).x(); - int y = this->subMesh.getCellCoordinates(i).y(); - - if(x == 0 && (boundaryCondition & 4) && y ==0) - { - if((u[subMesh.getCellYSuccessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 0, 1 >() > 1.0) - { - //cout << "x = 0; y = 0" <<std::endl; - u[i] = u[subMesh.getCellYSuccessor( i )] - subMesh.template getSpaceStepsProducts< 0, 1 >(); - } - } - else if(x == 0 && (boundaryCondition & 4) && y == subMesh.getDimensions().y() - 1) - { - if((u[subMesh.getCellYPredecessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 0, 1 >() > 1.0) - { - //cout << "x = 0; y = n" <<std::endl; - u[i] = u[subMesh.getCellYPredecessor( i )] - subMesh.template getSpaceStepsProducts< 0, 1 >(); - } - } - - - else if(x == subMesh.getDimensions().x() - 1 && (boundaryCondition & 2) && y ==0) - { - if((u[subMesh.getCellYSuccessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 0, 1 >() > 1.0) - { - //cout << "x = n; y = 0" <<std::endl; - u[i] = u[subMesh.getCellYSuccessor( i )] - subMesh.template getSpaceStepsProducts< 0, 1 >(); - } - } - else if(x == subMesh.getDimensions().x() - 1 && (boundaryCondition & 2) && y == subMesh.getDimensions().y() - 1) - { - if((u[subMesh.getCellYPredecessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 0, 1 >() > 1.0) - { - //cout << "x = n; y = n" <<std::endl; - u[i] = u[subMesh.getCellYPredecessor( i )] - subMesh.template getSpaceStepsProducts< 0, 1 >(); - } - } - - - else if(y == 0 && (boundaryCondition & 8) && x ==0) - { - if((u[subMesh.getCellXSuccessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 1, 0 >() > 1.0) - { - //cout << "y = 0; x = 0" <<std::endl; - u[i] = u[subMesh.getCellXSuccessor( i )] - subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - } - else if(y == 0 && (boundaryCondition & 8) && x == subMesh.getDimensions().x() - 1) - { - if((u[subMesh.getCellXPredecessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 1, 0 >() > 1.0) - { - //cout << "y = 0; x = n" <<std::endl; - u[i] = u[subMesh.getCellXPredecessor( i )] - subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - } - - - else if(y == subMesh.getDimensions().y() - 1 && (boundaryCondition & 1) && x ==0) - { - if((u[subMesh.getCellXSuccessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 1, 0 >() > 1.0) { - //cout << "y = n; x = 0" <<std::endl; - u[i] = u[subMesh.getCellXSuccessor( i )] - subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - } - else if(y == subMesh.getDimensions().y() - 1 && (boundaryCondition & 1) && x == subMesh.getDimensions().x() - 1) - { - if((u[subMesh.getCellXPredecessor( i )] - u[i])/subMesh.template getSpaceStepsProducts< 1, 0 >() > 1.0) - { - //cout << "y = n; x = n" <<std::endl; - u[i] = u[subMesh.getCellXPredecessor( i )] - subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - } - }*/ - - /**/ - - -/* bool tmp = false; - for(int i = 0; i < u.getSize(); i++) - { - if(u[0]*u[i] <= 0.0) - tmp=true; - } - - - if(tmp) - {} - else if(boundaryCondition == 4) - { - int i; - for(i = 0; i < u.getSize() - subMesh.getDimensions().x() ; i=subMesh.getCellYSuccessor(i)) - { - int j; - for(j = i; j < subMesh.getDimensions().x() - 1; j=subMesh.getCellXSuccessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } - int j; - for(j = i; j < subMesh.getDimensions().x() - 1; j=subMesh.getCellXSuccessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } - else if(boundaryCondition == 8) - { - int i; - for(i = 0; i < subMesh.getDimensions().x() - 1; i=subMesh.getCellXSuccessor(i)) - { - int j; - for(j = i; j < u.getSize() - subMesh.getDimensions().x(); j=subMesh.getCellYSuccessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } - int j; - for(j = i; j < u.getSize() - subMesh.getDimensions().x(); j=subMesh.getCellYSuccessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - - } - else if(boundaryCondition == 2) - { - int i; - for(i = subMesh.getDimensions().x() - 1; i < u.getSize() - subMesh.getDimensions().x() ; i=subMesh.getCellYSuccessor(i)) - { - int j; - for(j = i; j > (i-1)*subMesh.getDimensions().x(); j=subMesh.getCellXPredecessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } - int j; - for(j = i; j > (i-1)*subMesh.getDimensions().x(); j=subMesh.getCellXPredecessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } - else if(boundaryCondition == 1) - { - int i; - for(i = (subMesh.getDimensions().y() - 1)*subMesh.getDimensions().x(); i < u.getSize() - 1; i=subMesh.getCellXSuccessor(i)) - { - int j; - for(j = i; j >=subMesh.getDimensions().x(); j=subMesh.getCellYPredecessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } - int j; - for(j = i; j >=subMesh.getDimensions().x(); j=subMesh.getCellYPredecessor(j)) - { - u[j] = u[i]; - } - u[j] = u[i]; - } -*/ - /**/ - - - - bool tmp = false; - for(int i = 0; i < u.getSize(); i++) - { - if(u[0]*u[i] <= 0.0) - tmp=true; - int centerGID = (this->n*(subGridID / this->gridRows)+ (this->n >> 1))*(this->n*this->gridCols) + this->n*(subGridID % this->gridRows) + (this->n >> 1); - if(this->unusedCell[centerGID] == 0 || boundaryCondition == 0) - tmp = true; - } - //if(this->currentStep + 3 < getSubgridValue(subGridID)) - //tmp = true; - - - double value = sign(u[0]) * u.absMax(); - - if(tmp) - {} - - - //north - 1, east - 2, west - 4, south - 8 - else if(boundaryCondition == 4) - { - for(int i = 0; i < this->n; i++) - for(int j = 1;j < this->n; j++) - //if(fabs(u[i*this->n + j]) < fabs(u[i*this->n])) - u[i*this->n + j] = value;// u[i*this->n]; - } - else if(boundaryCondition == 2) - { - for(int i = 0; i < this->n; i++) - for(int j =0 ;j < this->n -1; j++) - //if(fabs(u[i*this->n + j]) < fabs(u[(i+1)*this->n - 1])) - u[i*this->n + j] = value;// u[(i+1)*this->n - 1]; - } - else if(boundaryCondition == 1) - { - for(int j = 0; j < this->n; j++) - for(int i = 0;i < this->n - 1; i++) - //if(fabs(u[i*this->n + j]) < fabs(u[j + this->n*(this->n - 1)])) - u[i*this->n + j] = value;// u[j + this->n*(this->n - 1)]; - } - else if(boundaryCondition == 8) - { - for(int j = 0; j < this->n; j++) - for(int i = 1;i < this->n; i++) - //if(fabs(u[i*this->n + j]) < fabs(u[j])) - u[i*this->n + j] = value;// u[j]; - } - -/* - - else if(boundaryCondition == 5) - { - for(int i = 0; i < this->n - 1; i++) - for(int j = 1;j < this->n; j++) - //if(fabs(u[i*this->n + j]) < fabs(u[i*this->n])) - u[i*this->n + j] = value;// u[i*this->n]; - } - else if(boundaryCondition == 10) - { - for(int i = 1; i < this->n; i++) - for(int j =0 ;j < this->n -1; j++) - //if(fabs(u[i*this->n + j]) < fabs(u[(i+1)*this->n - 1])) - u[i*this->n + j] = value;// u[(i+1)*this->n - 1]; - } - else if(boundaryCondition == 3) - { - for(int j = 0; j < this->n - 1; j++) - for(int i = 0;i < this->n - 1; i++) - //if(fabs(u[i*this->n + j]) < fabs(u[j + this->n*(this->n - 1)])) - u[i*this->n + j] = value;// u[j + this->n*(this->n - 1)]; - } - else if(boundaryCondition == 12) - { - for(int j = 1; j < this->n; j++) - for(int i = 1;i < this->n; i++) - //if(fabs(u[i*this->n + j]) < fabs(u[j])) - u[i*this->n + j] = value;// u[j]; - } -*/ - - - /**/ - - /*if (u.max() > 0.0) - this->stopTime *=(double) this->gridCols;*/ - - - double time = 0.0; - double currentTau = this->tau0; - double finalTime = this->stopTime;// + 3.0*(u.max() - u.min()); - if( time + currentTau > finalTime ) currentTau = finalTime - time; - - double maxResidue( 1.0 ); - //double lastResidue( 10000.0 ); - tnlGridEntity<MeshType, 2, tnlGridEntityNoStencilStorage > Entity(subMesh); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - while( time < finalTime /*|| maxResidue > subMesh.template getSpaceStepsProducts< 1, 0 >()*/) - { - /**** - * Compute the RHS - */ - - for( int i = 0; i < fu.getSize(); i ++ ) - { - Entity.setCoordinates(Containers::StaticVector<2,int>(i % subMesh.getDimensions().x(),i / subMesh.getDimensions().x())); - Entity.refresh(); - neighborEntities.refresh(subMesh,Entity.getIndex()); - fu[ i ] = schemeHost.getValue( this->subMesh, i, Containers::StaticVector<2,int>(i % subMesh.getDimensions().x(),i / subMesh.getDimensions().x()), u, time, boundaryCondition,neighborEntities); - } - maxResidue = fu. absMax(); - - - if( this -> cflCondition * maxResidue != 0.0) - currentTau = this -> cflCondition / maxResidue; - - /* if (maxResidue < 0.05) - std::cout << "Max < 0.05" <<std::endl;*/ - if(currentTau > 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >()) - { - //cout << currentTau << " >= " << 2.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >() <<std::endl; - currentTau = 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - /*if(maxResidue > lastResidue) - currentTau *=(1.0/10.0);*/ - - - if( time + currentTau > finalTime ) currentTau = finalTime - time; -// for( int i = 0; i < fu.getSize(); i ++ ) -// { -// //cout << "Too big RHS! i = " << i << ", fu = " << fu[i] << ", u = " << u[i] <<std::endl; -// if((u[i]+currentTau * fu[ i ])*u[i] < 0.0 && fu[i] != 0.0 && u[i] != 0.0 ) -// currentTau = fabs(u[i]/(2.0*fu[i])); -// -// } - - - for( int i = 0; i < fu.getSize(); i ++ ) - { - double add = u[i] + currentTau * fu[ i ]; - //if( fabs(u[i]) < fabs(add) or (this->subgridValues[subGridID] == this->currentStep +4) ) - u[ i ] = add; - } - time += currentTau; - - //cout << '\r' << flush; - //cout << maxResidue << " " << currentTau << " @ " << time << flush; - //lastResidue = maxResidue; - } - //cout << "Time: " << time << ", Res: " << maxResidue <<endl; - /*if (u.max() > 0.0) - this->stopTime /=(double) this->gridCols;*/ - - VectorType solution; - solution.setLike(u); - for( int i = 0; i < u.getSize(); i ++ ) - { - solution[i]=u[i]; - } - return solution; -} - - -#ifdef HAVE_CUDA - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgridCUDA2D( const int i ,tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller, double* a) -{ - //int j = threadIdx.x + threadIdx.y * blockDim.x; - int th = (blockIdx.y) * caller->n*caller->n*caller->gridCols - + (blockIdx.x) * caller->n - + threadIdx.y * caller->n*caller->gridCols - + threadIdx.x; - //printf("i= %d,j= %d,th= %d\n",i,j,th); - *a = caller->work_u_cuda[th]; - //printf("Hi %f \n", *a); - //return ret; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::updateSubgridCUDA2D( const int i ,tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller, double* a) -{ -// int j = threadIdx.x + threadIdx.y * blockDim.x; - int index = (blockIdx.y) * caller->n*caller->n*caller->gridCols - + (blockIdx.x) * caller->n - + threadIdx.y * caller->n*caller->gridCols - + threadIdx.x; - - if( (fabs(caller->work_u_cuda[index]) > fabs(*a)) || (caller->unusedCell_cuda[index] == 1) ) - { - caller->work_u_cuda[index] = *a; - caller->unusedCell_cuda[index] = 0; - - } - - *a = caller->work_u_cuda[index]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::insertSubgridCUDA2D( double u, const int i ) -{ - - -// int j = threadIdx.x + threadIdx.y * blockDim.x; - //printf("j = %d, u = %f\n", j,u); - - int index = (blockIdx.y)*this->n*this->n*this->gridCols - + (blockIdx.x)*this->n - + threadIdx.y*this->n*this->gridCols - + threadIdx.x; - - //printf("i= %d,j= %d,index= %d\n",i,j,index); - if( (fabs(this->work_u_cuda[index]) > fabs(u)) || (this->unusedCell_cuda[index] == 1) ) - { - this->work_u_cuda[index] = u; - this->unusedCell_cuda[index] = 0; - - } - - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::runSubgridCUDA2D( int boundaryCondition, double* u, int subGridID) -{ - - __shared__ int tmp; - __shared__ double value; - //double tmpRes = 0.0; - volatile double* sharedTau = &u[blockDim.x*blockDim.y]; - volatile double* absVal = &u[2*blockDim.x*blockDim.y]; - int i = threadIdx.x; - int j = threadIdx.y; - int l = threadIdx.y * blockDim.x + threadIdx.x; - bool computeFU = !((i == 0 && (boundaryCondition & 4)) or - (i == blockDim.x - 1 && (boundaryCondition & 2)) or - (j == 0 && (boundaryCondition & 8)) or - (j == blockDim.y - 1 && (boundaryCondition & 1))); - - if(l == 0) - { - tmp = 0; - int centerGID = (blockDim.y*blockIdx.y + (blockDim.y>>1))*(blockDim.x*gridDim.x) + blockDim.x*blockIdx.x + (blockDim.x>>1); - if(this->unusedCell_cuda[centerGID] == 0 || boundaryCondition == 0) - tmp = 1; - } - __syncthreads(); - - /*if(!tmp && (u[0]*u[l] <= 0.0)) - atomicMax( &tmp, 1);*/ - - __syncthreads(); - if(tmp !=1) - { -// if(computeFU) -// absVal[l]=0.0; -// else -// absVal[l] = fabs(u[l]); -// -// __syncthreads(); -// -// if((blockDim.x == 16) && (l < 128)) absVal[l] = Max(absVal[l],absVal[l+128]); -// __syncthreads(); -// if((blockDim.x == 16) && (l < 64)) absVal[l] = Max(absVal[l],absVal[l+64]); -// __syncthreads(); -// if(l < 32) absVal[l] = Max(absVal[l],absVal[l+32]); -// if(l < 16) absVal[l] = Max(absVal[l],absVal[l+16]); -// if(l < 8) absVal[l] = Max(absVal[l],absVal[l+8]); -// if(l < 4) absVal[l] = Max(absVal[l],absVal[l+4]); -// if(l < 2) absVal[l] = Max(absVal[l],absVal[l+2]); -// if(l < 1) value = sign(u[0])*Max(absVal[l],absVal[l+1]); -// __syncthreads(); -// -// if(computeFU) -// u[l] = value; - if(computeFU) - { - if(boundaryCondition == 4) - u[l] = u[threadIdx.y * blockDim.x] + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(threadIdx.x) ;//+ 2*sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(threadIdx.x+this->n); - else if(boundaryCondition == 2) - u[l] = u[threadIdx.y * blockDim.x + blockDim.x - 1] + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(this->n - 1 - threadIdx.x);//+ 2*sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(blockDim.x - threadIdx.x - 1+this->n); - else if(boundaryCondition == 8) - u[l] = u[threadIdx.x] + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(threadIdx.y) ;//+ 2*sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(threadIdx.y+this->n); - else if(boundaryCondition == 1) - u[l] = u[(blockDim.y - 1)* blockDim.x + threadIdx.x] + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(this->n - 1 - threadIdx.y) ;//+ sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0 >()*(blockDim.y - threadIdx.y - 1 +this->n); - } - } - - double time = 0.0; - __shared__ double currentTau; - double cfl = this->cflCondition; - double fu = 0.0; -// if(threadIdx.x * threadIdx.y == 0) -// { -// currentTau = finalTime; -// } - double finalTime = this->stopTime; - __syncthreads(); -// if( time + currentTau > finalTime ) currentTau = finalTime - time; - - tnlGridEntity<MeshType, 2, tnlGridEntityNoStencilStorage > Entity(subMesh); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 2, tnlGridEntityNoStencilStorage >,2> neighborEntities(Entity); - Entity.setCoordinates(Containers::StaticVector<2,int>(i,j)); - Entity.refresh(); - neighborEntities.refresh(subMesh,Entity.getIndex()); - - - while( time < finalTime ) - { - if(computeFU) - fu = schemeHost.getValueDev( this->subMesh, l, Containers::StaticVector<2,int>(i,j)/*this->subMesh.getCellCoordinates(l)*/, u, time, boundaryCondition, neighborEntities); - - sharedTau[l]=abs(cfl/fu); - - if(l == 0) - { - if(sharedTau[0] > 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >()) sharedTau[0] = 1.0 * this->subMesh.template getSpaceStepsProducts< 1, 0 >(); - } - else if(l == blockDim.x*blockDim.y - 1) - if( time + sharedTau[l] > finalTime ) sharedTau[l] = finalTime - time; - - -// if( (sign(u[l]+sharedTau[l]*fu) != sign(u[l])) && fu != 0.0 && fu != -0.0) -// { -// printf("orig: %10f", sharedTau[l]); -// sharedTau[l]=abs(u[l]/(1.1*fu)) ; -// printf(" new: %10f\n", sharedTau[l]); -// } - - - - if((blockDim.x == 16) && (l < 128)) sharedTau[l] = Min(sharedTau[l],sharedTau[l+128]); - __syncthreads(); - if((blockDim.x == 16) && (l < 64)) sharedTau[l] = Min(sharedTau[l],sharedTau[l+64]); - __syncthreads(); - if(l < 32) sharedTau[l] = Min(sharedTau[l],sharedTau[l+32]); - if(l < 16) sharedTau[l] = Min(sharedTau[l],sharedTau[l+16]); - if(l < 8) sharedTau[l] = Min(sharedTau[l],sharedTau[l+8]); - if(l < 4) sharedTau[l] = Min(sharedTau[l],sharedTau[l+4]); - if(l < 2) sharedTau[l] = Min(sharedTau[l],sharedTau[l+2]); - if(l < 1) currentTau = Min(sharedTau[l],sharedTau[l+1]); - __syncthreads(); - - u[l] += currentTau * fu; - time += currentTau; - } - - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getOwnerCUDA2D(int i) const -{ - - return ((i / (this->gridCols*this->n*this->n))*this->gridCols - + (i % (this->gridCols*this->n))/this->n); -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getSubgridValueCUDA2D( int i ) const -{ - return this->subgridValues_cuda[i]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setSubgridValueCUDA2D(int i, int value) -{ - this->subgridValues_cuda[i] = value; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::getBoundaryConditionCUDA2D( int i ) const -{ - return this->boundaryConditions_cuda[i]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::setBoundaryConditionCUDA2D(int i, int value) -{ - this->boundaryConditions_cuda[i] = value; -} - - - -//north - 1, east - 2, west - 4, south - 8 - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void /*tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::*/synchronizeCUDA2D(tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver) //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now -{ - - __shared__ int boundary[4]; // north,east,west,south - __shared__ int subgridValue; - __shared__ int newSubgridValue; - - - int gid = (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + blockDim.x*blockIdx.x + threadIdx.x; - double u = cudaSolver->work_u_cuda[gid]; - double u_cmp; - int subgridValue_cmp=INT_MAX; - int boundary_index=0; - - - if(threadIdx.x+threadIdx.y == 0) - { - subgridValue = cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x); - boundary[0] = 0; - boundary[1] = 0; - boundary[2] = 0; - boundary[3] = 0; - newSubgridValue = 0; - //printf("%d %d\n", blockDim.x, gridDim.x); - } - __syncthreads(); - - - - if( (threadIdx.x == 0 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.y == 0 /* && (cudaSolver->currentStep & 1)*/) || - (threadIdx.x == blockDim.x - 1 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.y == blockDim.y - 1 /* && (cudaSolver->currentStep & 1)*/) ) - { - if(threadIdx.x == 0 && (blockIdx.x != 0)/* && !(cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - 1]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x - 1); - boundary_index = 2; - } - - if(threadIdx.x == blockDim.x - 1 && (blockIdx.x != gridDim.x - 1)/* && !(cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + 1]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x + 1); - boundary_index = 1; - } - - __threadfence(); - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - u=u_cmp; - } - __threadfence(); - if(threadIdx.y == 0 && (blockIdx.y != 0)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - blockDim.x*gridDim.x]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D((blockIdx.y - 1)*gridDim.x + blockIdx.x); - boundary_index = 3; - } - if(threadIdx.y == blockDim.y - 1 && (blockIdx.y != gridDim.y - 1)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + blockDim.x*gridDim.x]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA2D((blockIdx.y + 1)*gridDim.x + blockIdx.x); - boundary_index = 0; - } - -// __threadfence(); - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - } - } - __threadfence(); - __syncthreads(); - - if(threadIdx.x+threadIdx.y == 0) - { - if(subgridValue == INT_MAX && newSubgridValue !=0) - cudaSolver->setSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, -INT_MAX); - - cudaSolver->setBoundaryConditionCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, boundary[0] + - 2 * boundary[1] + - 4 * boundary[2] + - 8 * boundary[3]); - - - if(blockIdx.x+blockIdx.y ==0) - { - cudaSolver->currentStep = cudaSolver->currentStep + 1; - *(cudaSolver->runcuda) = 0; - } -// -// int stepValue = cudaSolver->currentStep + 4; -// if( cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x) == -INT_MAX ) -// cudaSolver->setSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, stepValue); -// -// atomicMax((cudaSolver->runcuda),cudaSolver->getBoundaryConditionCUDA2D(blockIdx.y*gridDim.x + blockIdx.x)); - } - - - /* - //printf("I am not an empty kernel!\n"); - //cout << "Synchronizig..." <<std::endl; - int tmp1, tmp2; - int grid1, grid2; - - if(cudaSolver->currentStep & 1) - { - //printf("I am not an empty kernel! 1\n"); - for(int j = 0; j < cudaSolver->gridRows - 1; j++) - { - //printf("I am not an empty kernel! 3\n"); - for (int i = 0; i < cudaSolver->gridCols*cudaSolver->n; i++) - { - tmp1 = cudaSolver->gridCols*cudaSolver->n*((cudaSolver->n-1)+j*cudaSolver->n) + i; - tmp2 = cudaSolver->gridCols*cudaSolver->n*((cudaSolver->n)+j*cudaSolver->n) + i; - grid1 = cudaSolver->getSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1)); - grid2 = cudaSolver->getSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2)); - - if ((fabs(cudaSolver->work_u_cuda[tmp1]) < fabs(cudaSolver->work_u_cuda[tmp2]) - cudaSolver->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - //printf("%d %d %d %d \n",tmp1,tmp2,cudaSolver->getOwnerCUDA2D(tmp1),cudaSolver->getOwnerCUDA2D(tmp2)); - cudaSolver->work_u_cuda[tmp2] = cudaSolver->work_u_cuda[tmp1]; - cudaSolver->unusedCell_cuda[tmp2] = 0; - if(grid2 == INT_MAX) - { - cudaSolver->setSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2), -INT_MAX); - } - if(! (cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2)) & 8) ) - cudaSolver->setBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2), cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2))+8); - } - else if ((fabs(cudaSolver->work_u_cuda[tmp1]) > fabs(cudaSolver->work_u_cuda[tmp2]) + cudaSolver->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - //printf("%d %d %d %d \n",tmp1,tmp2,cudaSolver->getOwnerCUDA2D(tmp1),cudaSolver->getOwnerCUDA2D(tmp2)); - cudaSolver->work_u_cuda[tmp1] = cudaSolver->work_u_cuda[tmp2]; - cudaSolver->unusedCell_cuda[tmp1] = 0; - if(grid1 == INT_MAX) - { - cudaSolver->setSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1), -INT_MAX); - } - if(! (cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1)) & 1) ) - cudaSolver->setBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1), cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1))+1); - } - } - } - - } - else - { - //printf("I am not an empty kernel! 2\n"); - for(int i = 1; i < cudaSolver->gridCols; i++) - { - //printf("I am not an empty kernel! 4\n"); - for (int j = 0; j < cudaSolver->gridRows*cudaSolver->n; j++) - { - - tmp1 = cudaSolver->gridCols*cudaSolver->n*j + i*cudaSolver->n - 1; - tmp2 = cudaSolver->gridCols*cudaSolver->n*j + i*cudaSolver->n ; - grid1 = cudaSolver->getSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1)); - grid2 = cudaSolver->getSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2)); - - if ((fabs(cudaSolver->work_u_cuda[tmp1]) < fabs(cudaSolver->work_u_cuda[tmp2]) - cudaSolver->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - //printf("%d %d %d %d \n",tmp1,tmp2,cudaSolver->getOwnerCUDA2D(tmp1),cudaSolver->getOwnerCUDA2D(tmp2)); - cudaSolver->work_u_cuda[tmp2] = cudaSolver->work_u_cuda[tmp1]; - cudaSolver->unusedCell_cuda[tmp2] = 0; - if(grid2 == INT_MAX) - { - cudaSolver->setSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2), -INT_MAX); - } - if(! (cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2)) & 4) ) - cudaSolver->setBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2), cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp2))+4); - } - else if ((fabs(cudaSolver->work_u_cuda[tmp1]) > fabs(cudaSolver->work_u_cuda[tmp2]) + cudaSolver->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - //printf("%d %d %d %d \n",tmp1,tmp2,cudaSolver->getOwnerCUDA2D(tmp1),cudaSolver->getOwnerCUDA2D(tmp2)); - cudaSolver->work_u_cuda[tmp1] = cudaSolver->work_u_cuda[tmp2]; - cudaSolver->unusedCell_cuda[tmp1] = 0; - if(grid1 == INT_MAX) - { - cudaSolver->setSubgridValueCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1), -INT_MAX); - } - if(! (cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1)) & 2) ) - cudaSolver->setBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1), cudaSolver->getBoundaryConditionCUDA2D(cudaSolver->getOwnerCUDA2D(tmp1))+2); - } - } - } - } - //printf("I am not an empty kernel! 5 cudaSolver->currentStep : %d \n", cudaSolver->currentStep); - - cudaSolver->currentStep = cudaSolver->currentStep + 1; - int stepValue = cudaSolver->currentStep + 4; - for (int i = 0; i < cudaSolver->gridRows * cudaSolver->gridCols; i++) - { - if( cudaSolver->getSubgridValueCUDA2D(i) == -INT_MAX ) - cudaSolver->setSubgridValueCUDA2D(i, stepValue); - } - - int maxi = 0; - for(int q=0; q < cudaSolver->gridRows*cudaSolver->gridCols;q++) - { - //printf("%d : %d\n", q, cudaSolver->boundaryConditions_cuda[q]); - maxi=Max(maxi,cudaSolver->getBoundaryConditionCUDA2D(q)); - } - //printf("I am not an empty kernel! %d\n", maxi); - *(cudaSolver->runcuda) = (maxi > 0); - //printf("I am not an empty kernel! 7 %d\n", cudaSolver->boundaryConditions_cuda[0]); - //cout << "Grid synchronized at step " << (this->currentStep - 1 ) <<std::endl; -*/ -} - - - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void synchronize2CUDA2D(tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver) -{ -// if(blockIdx.x+blockIdx.y ==0) -// { -// cudaSolver->currentStep = cudaSolver->currentStep + 1; -// *(cudaSolver->runcuda) = 0; -// } - - int stepValue = cudaSolver->currentStep + 4; - if( cudaSolver->getSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x) == -INT_MAX ) - cudaSolver->setSubgridValueCUDA2D(blockIdx.y*gridDim.x + blockIdx.x, stepValue); - - atomicMax((cudaSolver->runcuda),cudaSolver->getBoundaryConditionCUDA2D(blockIdx.y*gridDim.x + blockIdx.x)); -} - - - - - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void /*tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::*/initCUDA2D( tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver, double* ptr , int* ptr2, int* ptr3) -{ - //cout << "Initializating solver..." <<std::endl; - //const String& meshLocation = parameters.getParameter <String>("mesh"); - //this->mesh_cuda.load( meshLocation ); - - //this->n_cuda = parameters.getParameter <int>("subgrid-size"); - //cout << "Setting N << this->n_cuda <<std::endl; - - //this->subMesh_cuda.setDimensions( this->n_cuda, this->n_cuda ); - //this->subMesh_cuda.setDomain( Containers::StaticVector<2,double>(0.0, 0.0), - //Containers::StaticVector<2,double>(this->mesh_cuda.template getSpaceStepsProducts< 1, 0 >()*(double)(this->n_cuda), this->mesh_cuda.template getSpaceStepsProducts< 0, 1 >()*(double)(this->n_cuda)) ); - - //this->subMesh_cuda.save("submesh.tnl"); - -// const String& initialCondition = parameters.getParameter <String>("initial-condition"); -// this->u0.load( initialCondition ); - - //cout << this->mesh.getCellCenter(0) <<std::endl; - - //this->delta_cuda = parameters.getParameter <double>("delta"); - //this->delta_cuda *= this->mesh_cuda.template getSpaceStepsProducts< 1, 0 >()*this->mesh_cuda.template getSpaceStepsProducts< 0, 1 >(); - - //cout << "Setting delta to " << this->delta <<std::endl; - - //this->tau0_cuda = parameters.getParameter <double>("initial-tau"); - //cout << "Setting initial tau to " << this->tau0_cuda <<std::endl; - //this->stopTime_cuda = parameters.getParameter <double>("stop-time"); - - //this->cflCondition_cuda = parameters.getParameter <double>("cfl-condition"); - //this -> cflCondition_cuda *= sqrt(this->mesh_cuda.template getSpaceStepsProducts< 1, 0 >()*this->mesh_cuda.template getSpaceStepsProducts< 0, 1 >()); - //cout << "Setting CFL to " << this->cflCondition <<std::endl; -//// -//// - -// this->gridRows_cuda = gridRows; -// this->gridCols_cuda = gridCols; - - cudaSolver->work_u_cuda = ptr;//(double*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->n*cudaSolver->n*sizeof(double)); - cudaSolver->unusedCell_cuda = ptr3;//(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->n*cudaSolver->n*sizeof(int)); - cudaSolver->subgridValues_cuda =(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*sizeof(int)); - cudaSolver->boundaryConditions_cuda =(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*sizeof(int)); - cudaSolver->runcuda = ptr2;//(bool*)malloc(sizeof(bool)); - *(cudaSolver->runcuda) = 1; - cudaSolver->currentStep = 1; - //cudaMemcpy(ptr,&(cudaSolver->work_u_cuda), sizeof(double*),cudaMemcpyDeviceToHost); - //ptr = cudaSolver->work_u_cuda; - printf("GPU memory allocated.\n"); - - for(int i = 0; i < cudaSolver->gridCols*cudaSolver->gridRows; i++) - { - cudaSolver->subgridValues_cuda[i] = INT_MAX; - cudaSolver->boundaryConditions_cuda[i] = 0; - } - - /*for(long int j = 0; j < cudaSolver->n*cudaSolver->n*cudaSolver->gridCols*cudaSolver->gridRows; j++) - { - printf("%d\n",j); - cudaSolver->unusedCell_cuda[ j] = 1; - }*/ - printf("GPU memory initialized.\n"); - - - //cudaSolver->work_u_cuda[50] = 32.153438; -//// -//// - //stretchGrid(); - //this->stopTime_cuda /= (double)(this->gridCols_cuda); - //this->stopTime_cuda *= (1.0+1.0/((double)(this->n_cuda) - 1.0)); - //cout << "Setting stopping time to " << this->stopTime <<std::endl; - //this->stopTime_cuda = 1.5*((double)(this->n_cuda))*parameters.getParameter <double>("stop-time")*this->mesh_cuda.template getSpaceStepsProducts< 1, 0 >(); - //cout << "Setting stopping time to " << this->stopTime <<std::endl; - - //cout << "Initializating scheme..." <<std::endl; - //if(!this->schemeDevice.init(parameters)) -// { - //cerr << "Scheme failed to initialize." <<std::endl; -// return false; -// } - //cout << "Scheme initialized." <<std::endl; - - //test(); - -// this->currentStep_cuda = 1; - //return true; -} - - - - -//extern __shared__ double array[]; -template< typename SchemeHost, typename SchemeDevice, typename Device > -__global__ -void /*tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::*/initRunCUDA2D(tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller) - -{ - - - extern __shared__ double u[]; - //printf("%p\n",caller->work_u_cuda); - - int i = blockIdx.y * gridDim.x + blockIdx.x; - int l = threadIdx.y * blockDim.x + threadIdx.x; - - __shared__ int containsCurve; - if(l == 0) - containsCurve = 0; - - //double a; - caller->getSubgridCUDA2D(i,caller, &u[l]); - //printf("%f %f\n",a , u[l]); - //u[l] = a; - //printf("Hi %f \n", u[l]); - __syncthreads(); - //printf("hurewrwr %f \n", u[l]); - if(u[0] * u[l] <= 0.0) - { - //printf("contains %d \n",i); - atomicMax( &containsCurve, 1); - } - - __syncthreads(); - //printf("hu"); - //printf("%d : %f\n", l, u[l]); - if(containsCurve == 1) - { - //printf("have curve \n"); - caller->runSubgridCUDA2D(0,u,i); - //printf("%d : %f\n", l, u[l]); - __syncthreads(); - caller->insertSubgridCUDA2D(u[l],i); - __syncthreads(); - if(l == 0) - caller->setSubgridValueCUDA2D(i, 4); - } - - -} - - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device > -__global__ -void /*tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int>::*/runCUDA2D(tnlParallelEikonalSolver<2,SchemeHost, SchemeDevice, Device, double, int >* caller) -{ - extern __shared__ double u[]; - int i = blockIdx.y * gridDim.x + blockIdx.x; - int l = threadIdx.y * blockDim.x + threadIdx.x; - int bound = caller->getBoundaryConditionCUDA2D(i); - - if(caller->getSubgridValueCUDA2D(i) != INT_MAX && bound != 0 && caller->getSubgridValueCUDA2D(i) > 0) - { - caller->getSubgridCUDA2D(i,caller, &u[l]); - - //if(l == 0) - //printf("i = %d, bound = %d\n",i,caller->getSubgridValueCUDA2D(i)); - if(caller->getSubgridValueCUDA2D(i) == caller->currentStep+4) - { - if(bound & 1) - { - caller->runSubgridCUDA2D(1,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 2 ) - { - caller->runSubgridCUDA2D(2,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 4) - { - caller->runSubgridCUDA2D(4,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 8) - { - caller->runSubgridCUDA2D(8,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - - - - - - if( ((bound & 3 ))) - { - caller->runSubgridCUDA2D(3,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 5 ))) - { - caller->runSubgridCUDA2D(5,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 10 ))) - { - caller->runSubgridCUDA2D(10,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( (bound & 12 )) - { - caller->runSubgridCUDA2D(12,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - - - - - - } - - - else - { - - - - - - - - - - if( ((bound == 2))) - { - caller->runSubgridCUDA2D(2,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound == 1) )) - { - caller->runSubgridCUDA2D(1,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound == 8) )) - { - caller->runSubgridCUDA2D(8,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( (bound == 4)) - { - caller->runSubgridCUDA2D(4,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - - - - - - - - - - - if( ((bound & 3) )) - { - caller->runSubgridCUDA2D(3,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 5) )) - { - caller->runSubgridCUDA2D(5,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 10) )) - { - caller->runSubgridCUDA2D(10,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - if( (bound & 12) ) - { - caller->runSubgridCUDA2D(12,u,i); - //__syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - } - - - - - - - - - - - - - } - /*if( bound ) - { - caller->runSubgridCUDA2D(15,u,i); - __syncthreads(); - //caller->insertSubgridCUDA2D(u[l],i); - //__syncthreads(); - //caller->getSubgridCUDA2D(i,caller, &u[l]); - caller->updateSubgridCUDA2D(i,caller, &u[l]); - __syncthreads(); - }*/ - - if(l==0) - { - caller->setBoundaryConditionCUDA2D(i, 0); - caller->setSubgridValueCUDA2D(i, caller->getSubgridValueCUDA2D(i) - 1 ); - } - - - } - - - -} - -#endif /*HAVE_CUDA*/ - -#endif /* TNLPARALLELEIKONALSOLVER2D_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver3D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver3D_impl.h deleted file mode 100644 index dc3fd54679bc5c5b6be44841e56e1c32167b5226..0000000000000000000000000000000000000000 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi-parallel/tnlParallelEikonalSolver3D_impl.h +++ /dev/null @@ -1,1706 +0,0 @@ -/*************************************************************************** - tnlParallelEikonalSolver2D_impl.h - description - ------------------- - begin : Nov 28 , 2014 - copyright : (C) 2014 by Tomas Sobotik - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef TNLPARALLELEIKONALSOLVER3D_IMPL_H_ -#define TNLPARALLELEIKONALSOLVER3D_IMPL_H_ - - -#include "tnlParallelEikonalSolver.h" -#include <core/mfilename.h> - -template< typename SchemeHost, typename SchemeDevice, typename Device> -tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::tnlParallelEikonalSolver() -{ - cout << "a" <<std::endl; - this->device = TNL::Devices::HostDevice; /////////////// tnlCuda Device --- vypocet na GPU, TNL::Devices::HostDevice --- vypocet na CPU - -#ifdef HAVE_CUDA - if(this->device == tnlCudaDevice) - { - run_host = 1; - } -#endif - - cout << "b" <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::test() -{ -/* - for(int i =0; i < this->subgridValues.getSize(); i++ ) - { - insertSubgrid(getSubgrid(i), i); - } -*/ -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> - -bool tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::init( const Config::ParameterContainer& parameters ) -{ - cout << "Initializating solver..." <<std::endl; - const String& meshLocation = parameters.getParameter <String>("mesh"); - this->mesh.load( meshLocation ); - - this->n = parameters.getParameter <int>("subgrid-size"); - cout << "Setting N to " << this->n <<std::endl; - - this->subMesh.setDimensions( this->n, this->n, this->n ); - this->subMesh.setDomain( Containers::StaticVector<3,double>(0.0, 0.0, 0.0), - Containers::StaticVector<3,double>(mesh.template getSpaceStepsProducts< 1, 0, 0 >()*(double)(this->n), mesh.template getSpaceStepsProducts< 0, 1, 0 >()*(double)(this->n),mesh.template getSpaceStepsProducts< 0, 0, 1 >()*(double)(this->n)) ); - - this->subMesh.save("submesh.tnl"); - - const String& initialCondition = parameters.getParameter <String>("initial-condition"); - this->u0.load( initialCondition ); - - //cout << this->mesh.getCellCenter(0) <<std::endl; - - this->delta = parameters.getParameter <double>("delta"); - this->delta *= mesh.template getSpaceStepsProducts< 1, 0, 0 >()*mesh.template getSpaceStepsProducts< 0, 1, 0 >(); - - cout << "Setting delta to " << this->delta <<std::endl; - - this->tau0 = parameters.getParameter <double>("initial-tau"); - cout << "Setting initial tau to " << this->tau0 <<std::endl; - this->stopTime = parameters.getParameter <double>("stop-time"); - - this->cflCondition = parameters.getParameter <double>("cfl-condition"); - this -> cflCondition *= sqrt(mesh.template getSpaceStepsProducts< 1, 0, 0 >()*mesh.template getSpaceStepsProducts< 0, 1, 0 >()); - cout << "Setting CFL to " << this->cflCondition <<std::endl; - - stretchGrid(); - this->stopTime /= (double)(this->gridCols); - this->stopTime *= (1.0+1.0/((double)(this->n) - 2.0)); - cout << "Setting stopping time to " << this->stopTime <<std::endl; - //this->stopTime = 1.5*((double)(this->n))*parameters.getParameter <double>("stop-time")*mesh.template getSpaceStepsProducts< 1, 0, 0 >(); - //cout << "Setting stopping time to " << this->stopTime <<std::endl; - - cout << "Initializating scheme..." <<std::endl; - if(!this->schemeHost.init(parameters)) - { - cerr << "SchemeHost failed to initialize." <<std::endl; - return false; - } - cout << "Scheme initialized." <<std::endl; - - test(); - - VectorType* tmp = new VectorType[subgridValues.getSize()]; - - -#ifdef HAVE_CUDA - - if(this->device == tnlCudaDevice) - { - /*cout << "Testing... " <<std::endl; - if(this->device == tnlCudaDevice) - { - if( !initCUDA3D(parameters, gridRows, gridCols) ) - return false; - }*/ - //cout << "s" <<std::endl; - cudaMalloc(&(this->cudaSolver), sizeof(tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >)); - //cout << "s" <<std::endl; - cudaMemcpy(this->cudaSolver, this,sizeof(tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >), cudaMemcpyHostToDevice); - //cout << "s" <<std::endl; - double** tmpdev = NULL; - cudaMalloc(&tmpdev, sizeof(double*)); - //double* tmpw; - cudaMalloc(&(this->tmpw), this->work_u.getSize()*sizeof(double)); - cudaMalloc(&(this->runcuda), sizeof(int)); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - int* tmpUC; - cudaMalloc(&(tmpUC), this->work_u.getSize()*sizeof(int)); - cudaMemcpy(tmpUC, this->unusedCell.getData(), this->unusedCell.getSize()*sizeof(int), cudaMemcpyHostToDevice); - - initCUDA3D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<1,1>>>(this->cudaSolver, (this->tmpw), (this->runcuda),tmpUC); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << "s " <<std::endl; - //cudaMalloc(&(cudaSolver->work_u_cuda), this->work_u.getSize()*sizeof(double)); - double* tmpu = NULL; - - cudaMemcpy(&tmpu, tmpdev,sizeof(double*), cudaMemcpyDeviceToHost); - //printf("%p %p \n",tmpu,tmpw); - cudaMemcpy((this->tmpw), this->work_u.getData(), this->work_u.getSize()*sizeof(double), cudaMemcpyHostToDevice); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << "s "<<std::endl; - - } -#endif - - if(this->device == TNL::Devices::HostDevice) - { -#ifdef HAVE_OPENMP -#pragma omp parallel for num_threads(4) schedule(dynamic) -#endif - for(int i = 0; i < this->subgridValues.getSize(); i++) - { - bool containsCurve = false; -// cout << "Working on subgrid " << i <<" --- check 1" <<std::endl; - - if(! tmp[i].setSize(this->n*this->n*this->n)) - cout << "Could not allocate tmp["<< i <<"] array." <<std::endl; -// cout << "Working on subgrid " << i <<" --- check 2" <<std::endl; - - tmp[i] = getSubgrid(i); - containsCurve = false; -// cout << "Working on subgrid " << i <<" --- check 3" <<std::endl; - - - for(int j = 0; j < tmp[i].getSize(); j++) - { - if(tmp[i][0]*tmp[i][j] <= 0.0) - { - containsCurve = true; - j=tmp[i].getSize(); -// cout << tmp[i][0] << " " << tmp[i][j] <<std::endl; - } - - } -// cout << "Working on subgrid " << i <<" --- check 4" <<std::endl; - - if(containsCurve) - { -// cout << "Computing initial SDF on subgrid " << i << "." <<std::endl; - tmp[i] = runSubgrid(0, tmp[i] ,i); - insertSubgrid( tmp[i], i); - setSubgridValue(i, 4); -// cout << "Computed initial SDF on subgrid " << i << "." <<std::endl; - } - containsCurve = false; - - } -// cout << "CPU: Curve found" <<std::endl; - } -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { -// cout << "pre 1 kernel" <<std::endl; - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - dim3 threadsPerBlock(this->n, this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows,this->gridLevels); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - initRunCUDA3D<SchemeTypeHost,SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock,2*this->n*this->n*this->n*sizeof(double)>>>(this->cudaSolver); - cudaDeviceSynchronize(); -// cout << "post 1 kernel" <<std::endl; - - } -#endif - - - this->currentStep = 1; - if(this->device == TNL::Devices::HostDevice) - synchronize(); -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - dim3 threadsPerBlock(this->n, this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows,this->gridLevels); - //double * test = (double*)malloc(this->work_u.getSize()*sizeof(double)); - //cout << test[0] <<" " << test[1] <<" " << test[2] <<" " << test[3] <<std::endl; - //cudaMemcpy(/*this->work_u.getData()*/ test, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //cout << this->tmpw << " " << test[0] <<" " << test[1] << " " <<test[2] << " " <<test[3] <<std::endl; - - TNL_CHECK_CUDA_DEVICE; - - synchronizeCUDA3D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cout << cudaGetErrorString(cudaDeviceSynchronize()) <<std::endl; - TNL_CHECK_CUDA_DEVICE; - synchronize2CUDA3D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << test[0] << " " <<test[1] <<" " << test[2] << " " <<test[3] <<std::endl; - //cudaMemcpy(/*this->work_u.getData()*/ test, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //TNL_CHECK_CUDA_DEVICE; - //cout << this->tmpw << " " << test[0] << " " <<test[1] << " " <<test[2] <<" " << test[3] <<std::endl; - //free(test); - - } - -#endif - cout << "Solver initialized." <<std::endl; - - return true; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::run() -{ - if(this->device == TNL::Devices::HostDevice) - { - - bool end = false; - while (/*(this->boundaryConditions.max() > 0 ) ||*/ !end) - { - if(this->boundaryConditions.max() == 0 || this->subgridValues.max() < 0) - end=true; - else - end=false; -#ifdef HAVE_OPENMP -#pragma omp parallel for num_threads(4) schedule(dynamic) -#endif - for(int i = 0; i < this->subgridValues.getSize(); i++) - { - VectorType tmp; - tmp.setSize(this->n*this->n*this->n); - if(getSubgridValue(i) != INT_MAX) - { - //cout << "subMesh: " << i << ", BC: " << getBoundaryCondition(i) <<std::endl; - - if(getSubgridValue(i) == currentStep+4) - { - - if(getBoundaryCondition(i) & 1) - { - tmp = getSubgrid(i); - tmp = runSubgrid(1, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 2) - { - tmp = getSubgrid(i); - tmp = runSubgrid(2, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 4) - { - tmp = getSubgrid(i); - tmp = runSubgrid(4, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 8) - { - tmp = getSubgrid(i); - tmp = runSubgrid(8, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 16) - { - tmp = getSubgrid(i); - tmp = runSubgrid(16, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - if(getBoundaryCondition(i) & 32) - { - tmp = getSubgrid(i); - tmp = runSubgrid(32, tmp ,i); - insertSubgrid( tmp, i); - this->calculationsCount[i]++; - } - } - - if( getBoundaryCondition(i) & 19) - { - tmp = getSubgrid(i); - tmp = runSubgrid(19, tmp ,i); - insertSubgrid( tmp, i); - } - if( getBoundaryCondition(i) & 21) - { - tmp = getSubgrid(i); - tmp = runSubgrid(21, tmp ,i); - insertSubgrid( tmp, i); - } - if( getBoundaryCondition(i) & 26) - { - tmp = getSubgrid(i); - tmp = runSubgrid(26, tmp ,i); - insertSubgrid( tmp, i); - } - if( getBoundaryCondition(i) & 28) - { - tmp = getSubgrid(i); - tmp = runSubgrid(28, tmp ,i); - insertSubgrid( tmp, i); - } - - if( getBoundaryCondition(i) & 35) - { - tmp = getSubgrid(i); - tmp = runSubgrid(35, tmp ,i); - insertSubgrid( tmp, i); - } - if( getBoundaryCondition(i) & 37) - { - tmp = getSubgrid(i); - tmp = runSubgrid(37, tmp ,i); - insertSubgrid( tmp, i); - } - if( getBoundaryCondition(i) & 42) - { - tmp = getSubgrid(i); - tmp = runSubgrid(42, tmp ,i); - insertSubgrid( tmp, i); - } - if( getBoundaryCondition(i) & 44) - { - tmp = getSubgrid(i); - tmp = runSubgrid(44, tmp ,i); - insertSubgrid( tmp, i); - } - - - setBoundaryCondition(i, 0); - setSubgridValue(i, getSubgridValue(i)-1); - - } - } - synchronize(); - } - } -#ifdef HAVE_CUDA - else if(this->device == tnlCudaDevice) - { - //cout << "fn" <<std::endl; - bool end_cuda = false; - dim3 threadsPerBlock(this->n, this->n, this->n); - dim3 numBlocks(this->gridCols,this->gridRows,this->gridLevels); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cudaMalloc(&runcuda,sizeof(bool)); - //cudaMemcpy(runcuda, &run_host, sizeof(bool), cudaMemcpyHostToDevice); - //cout << "fn" <<std::endl; - bool* tmpb; - //cudaMemcpy(tmpb, &(cudaSolver->runcuda),sizeof(bool*), cudaMemcpyDeviceToHost); - //cudaDeviceSynchronize(); - //TNL_CHECK_CUDA_DEVICE; - cudaMemcpy(&(this->run_host),this->runcuda,sizeof(int), cudaMemcpyDeviceToHost); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //cout << "fn" <<std::endl; - int i = 1; - time_diff = 0.0; - while (run_host || !end_cuda) - { - cout << "Computing at step "<< i++ <<std::endl; - if(run_host != 0 ) - end_cuda = true; - else - end_cuda = false; - //cout << "a" <<std::endl; - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - start = std::clock(); - runCUDA3D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock,2*this->n*this->n*this->n*sizeof(double)>>>(this->cudaSolver); - //cout << "a" <<std::endl; - cudaDeviceSynchronize(); - time_diff += (std::clock() - start) / (double)(CLOCKS_PER_SEC); - - //start = std::clock(); - synchronizeCUDA3D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,threadsPerBlock>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - synchronize2CUDA3D<SchemeTypeHost, SchemeTypeDevice, DeviceType><<<numBlocks,1>>>(this->cudaSolver); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - //time_diff += (std::clock() - start) / (double)(CLOCKS_PER_SEC); - - - //cout << "a" <<std::endl; - //run_host = false; - //cout << "in kernel loop" << run_host <<std::endl; - //cudaMemcpy(tmpb, &(cudaSolver->runcuda),sizeof(bool*), cudaMemcpyDeviceToHost); - cudaMemcpy(&run_host, (this->runcuda),sizeof(int), cudaMemcpyDeviceToHost); - //cout << "in kernel loop" << run_host <<std::endl; - } - cout << "Solving time was: " << time_diff <<std::endl; - //cout << "b" <<std::endl; - - //double* tmpu; - //cudaMemcpy(tmpu, &(cudaSolver->work_u_cuda),sizeof(double*), cudaMemcpyHostToDevice); - //cudaMemcpy(this->work_u.getData(), tmpu, this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //cout << this->work_u.getData()[0] <<std::endl; - - //double * test = (double*)malloc(this->work_u.getSize()*sizeof(double)); - //cout << test[0] << test[1] << test[2] << test[3] <<std::endl; - cudaMemcpy(this->work_u.getData()/* test*/, (this->tmpw), this->work_u.getSize()*sizeof(double), cudaMemcpyDeviceToHost); - //cout << this->tmpw << " " << test[0] << test[1] << test[2] << test[3] <<std::endl; - //free(test); - - cudaDeviceSynchronize(); - } -#endif - contractGrid(); - this->u0.save("u-00001.tnl"); - cout << "Maximum number of calculations on one subgrid was " << this->calculationsCount.absMax() <<std::endl; - cout << "Average number of calculations on one subgrid was " << ( (double) this->calculationsCount.sum() / (double) this->calculationsCount.getSize() ) <<std::endl; - cout << "Solver finished" <<std::endl; - -#ifdef HAVE_CUDA - if(this->device == tnlCudaDevice) - { - cudaFree(this->runcuda); - cudaFree(this->tmpw); - cudaFree(this->cudaSolver); - } -#endif - -} - -//north - 1, east - 2, west - 4, south - 8 -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::synchronize() //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now -{ - cout << "Synchronizig..." <<std::endl; - int tmp1, tmp2; - int grid1, grid2; - -// if(this->currentStep & 1) -// { - for(int j = 0; j < this->gridRows - 1; j++) - { - for (int i = 0; i < this->gridCols*this->n; i++) - { - for (int k = 0; k < this->gridLevels*this->n; k++) - { -// cout << "a" <<std::endl; - tmp1 = this->gridCols*this->n*((this->n-1)+j*this->n) + i + k*this->gridCols*this->n*this->gridRows*this->n; -// cout << "b" <<std::endl; - tmp2 = this->gridCols*this->n*((this->n)+j*this->n) + i + k*this->gridCols*this->n*this->gridRows*this->n; -// cout << "c" <<std::endl; - if(tmp1 > work_u.getSize()) - cout << "tmp1: " << tmp1 << " x: " << j <<" y: " << i <<" z: " << k <<std::endl; - if(tmp2 > work_u.getSize()) - cout << "tmp2: " << tmp2 << " x: " << j <<" y: " << i <<" z: " << k <<std::endl; - grid1 = getSubgridValue(getOwner(tmp1)); -// cout << "d" <<std::endl; - grid2 = getSubgridValue(getOwner(tmp2)); -// cout << "e" <<std::endl; - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j, k" << i << "," << j << "," << k <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; -// cout << "f" <<std::endl; - this->unusedCell[tmp2] = 0; -// cout << "g" <<std::endl; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } -// cout << "h" <<std::endl; - if(! (getBoundaryCondition(getOwner(tmp2)) & 8) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+8); -// cout << "i" <<std::endl; - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; -// cout << "j" <<std::endl; - this->unusedCell[tmp1] = 0; -// cout << "k" <<std::endl; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } -// cout << "l" <<std::endl; - if(! (getBoundaryCondition(getOwner(tmp1)) & 1) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+1); -// cout << "m" <<std::endl; - } - } - } - } - -// } -// else -// { - - cout << "sync 2" <<std::endl; - for(int i = 1; i < this->gridCols; i++) - { - for (int j = 0; j < this->gridRows*this->n; j++) - { - for (int k = 0; k < this->gridLevels*this->n; k++) - { - tmp1 = this->gridCols*this->n*j + i*this->n - 1 + k*this->gridCols*this->n*this->gridRows*this->n; - tmp2 = this->gridCols*this->n*j + i*this->n + k*this->gridCols*this->n*this->gridRows*this->n; - grid1 = getSubgridValue(getOwner(tmp1)); - grid2 = getSubgridValue(getOwner(tmp2)); - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j, k" << i << "," << j << "," << k <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp2)) & 4) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+4); - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; - this->unusedCell[tmp1] = 0; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp1)) & 2) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+2); - } - } - } - } - - cout << "sync 3" <<std::endl; - - for(int k = 1; k < this->gridLevels; k++) - { - for (int j = 0; j < this->gridRows*this->n; j++) - { - for (int i = 0; i < this->gridCols*this->n; i++) - { - tmp1 = this->gridCols*this->n*j + i + (k*this->n-1)*this->gridCols*this->n*this->gridRows*this->n; - tmp2 = this->gridCols*this->n*j + i + k*this->n*this->gridCols*this->n*this->gridRows*this->n; - grid1 = getSubgridValue(getOwner(tmp1)); - grid2 = getSubgridValue(getOwner(tmp2)); - if(getOwner(tmp1)==getOwner(tmp2)) - cout << "i, j, k" << i << "," << j << "," << k <<std::endl; - if ((fabs(this->work_u[tmp1]) < fabs(this->work_u[tmp2]) - this->delta || grid2 == INT_MAX || grid2 == -INT_MAX) && (grid1 != INT_MAX && grid1 != -INT_MAX)) - { - this->work_u[tmp2] = this->work_u[tmp1]; - this->unusedCell[tmp2] = 0; - if(grid2 == INT_MAX) - { - setSubgridValue(getOwner(tmp2), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp2)) & 32) ) - setBoundaryCondition(getOwner(tmp2), getBoundaryCondition(getOwner(tmp2))+32); - } - else if ((fabs(this->work_u[tmp1]) > fabs(this->work_u[tmp2]) + this->delta || grid1 == INT_MAX || grid1 == -INT_MAX) && (grid2 != INT_MAX && grid2 != -INT_MAX)) - { - this->work_u[tmp1] = this->work_u[tmp2]; - this->unusedCell[tmp1] = 0; - if(grid1 == INT_MAX) - { - setSubgridValue(getOwner(tmp1), -INT_MAX); - } - if(! (getBoundaryCondition(getOwner(tmp1)) & 16) ) - setBoundaryCondition(getOwner(tmp1), getBoundaryCondition(getOwner(tmp1))+16); - } - } - } - } -// } - - - - this->currentStep++; - int stepValue = this->currentStep + 4; - for (int i = 0; i < this->subgridValues.getSize(); i++) - { - if( getSubgridValue(i) == -INT_MAX ) - setSubgridValue(i, stepValue); - } - - cout << "Grid synchronized at step " << (this->currentStep - 1 ) <<std::endl; - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getOwner(int i) const -{ - - int j = i % (this->gridCols*this->gridRows*this->n*this->n); - - return ( (i / (this->gridCols*this->gridRows*this->n*this->n*this->n))*this->gridCols*this->gridRows - + (j / (this->gridCols*this->n*this->n))*this->gridCols - + (j % (this->gridCols*this->n))/this->n); -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getSubgridValue( int i ) const -{ - return this->subgridValues[i]; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::setSubgridValue(int i, int value) -{ - this->subgridValues[i] = value; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -int tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getBoundaryCondition( int i ) const -{ - return this->boundaryConditions[i]; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::setBoundaryCondition(int i, int value) -{ - this->boundaryConditions[i] = value; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::stretchGrid() -{ - cout << "Stretching grid..." <<std::endl; - - - this->gridCols = ceil( ((double)(this->mesh.getDimensions().x()-1)) / ((double)(this->n-1)) ); - this->gridRows = ceil( ((double)(this->mesh.getDimensions().y()-1)) / ((double)(this->n-1)) ); - this->gridLevels = ceil( ((double)(this->mesh.getDimensions().z()-1)) / ((double)(this->n-1)) ); - - //this->gridCols = (this->mesh.getDimensions().x()-1) / (this->n-1) ; - //this->gridRows = (this->mesh.getDimensions().y()-1) / (this->n-1) ; - - cout << "Setting gridCols to " << this->gridCols << "." <<std::endl; - cout << "Setting gridRows to " << this->gridRows << "." <<std::endl; - cout << "Setting gridLevels to " << this->gridLevels << "." <<std::endl; - - this->subgridValues.setSize(this->gridCols*this->gridRows*this->gridLevels); - this->subgridValues.setValue(0); - this->boundaryConditions.setSize(this->gridCols*this->gridRows*this->gridLevels); - this->boundaryConditions.setValue(0); - this->calculationsCount.setSize(this->gridCols*this->gridRows*this->gridLevels); - this->calculationsCount.setValue(0); - - for(int i = 0; i < this->subgridValues.getSize(); i++ ) - { - this->subgridValues[i] = INT_MAX; - this->boundaryConditions[i] = 0; - } - - int levelSize = this->n*this->n*this->gridCols*this->gridRows; - int stretchedSize = this->n*levelSize*this->gridLevels; - - if(!this->work_u.setSize(stretchedSize)) - cerr << "Could not allocate memory for stretched grid." <<std::endl; - if(!this->unusedCell.setSize(stretchedSize)) - cerr << "Could not allocate memory for supporting stretched grid." <<std::endl; - int idealStretch =this->mesh.getDimensions().x() + (this->mesh.getDimensions().x()-2)/(this->n-1); - cout << idealStretch <<std::endl; - - - - - for(int i = 0; i < levelSize; i++) - { - int diff =(this->n*this->gridCols) - idealStretch ; - - int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)) + (i/(this->n*this->gridCols))*diff; - - if(i%(this->n*this->gridCols) - idealStretch >= 0) - { - k+= i%(this->n*this->gridCols) - idealStretch +1 ; - } - - if(i/(this->n*this->gridCols) - idealStretch + 1 > 0) - { - k+= (i/(this->n*this->gridCols) - idealStretch +1 )* this->mesh.getDimensions().x() ; - } - - for( int j = 0; j<this->n*this->gridLevels; j++) - { - this->unusedCell[i+j*levelSize] = 1; - int l = j/this->n; - - if(j - idealStretch >= 0) - { - l+= j - idealStretch + 1; - } - - this->work_u[i+j*levelSize] = this->u0[i+(j-l)*mesh.getDimensions().x()*mesh.getDimensions().y()-k]; - } - - } - - - - cout << "Grid stretched." <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::contractGrid() -{ - cout << "Contracting grid..." <<std::endl; - int levelSize = this->n*this->n*this->gridCols*this->gridRows; - int stretchedSize = this->n*levelSize*this->gridLevels; - - int idealStretch =this->mesh.getDimensions().x() + (this->mesh.getDimensions().x()-2)/(this->n-1); - cout << idealStretch <<std::endl; - - - for(int i = 0; i < levelSize; i++) - { - int diff =(this->n*this->gridCols) - idealStretch ; - int k = i/this->n - i/(this->n*this->gridCols) + this->mesh.getDimensions().x()*(i/(this->n*this->n*this->gridCols)) + (i/(this->n*this->gridCols))*diff; - - if((i%(this->n*this->gridCols) - idealStretch < 0) && (i/(this->n*this->gridCols) - idealStretch + 1 <= 0) ) - { - for( int j = 0; j<this->n*this->gridLevels; j++) - { - int l = j/this->n; - if(j - idealStretch < 0) - this->u0[i+(j-l)*mesh.getDimensions().x()*mesh.getDimensions().y()-k] = this->work_u[i+j*levelSize]; - } - } - - } - - cout << "Grid contracted" <<std::endl; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -typename tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::VectorType -tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getSubgrid( const int i ) const -{ - - VectorType u; - u.setSize(this->n*this->n*this->n); - - int idx, idy, idz; - idz = i / (gridRows*this->gridCols); - idy = (i % (this->gridRows*this->gridCols)) / this->gridCols; - idx = i % (this->gridCols); - - for( int j = 0; j < this->n; j++) - { - // int index = (i / this->gridCols)*this->n*this->n*this->gridCols + (i % this->gridCols)*this->n + (j/this->n)*this->n*this->gridCols + (j % this->n); - for( int k = 0; k < this->n; k++) - { - for( int l = 0; l < this->n; l++) - { - int index = (idz*this->n + l) * this->n*this->n*this->gridCols*this->gridRows - + (idy) * this->n*this->n*this->gridCols - + (idx) * this->n - + k * this->n*this->gridCols - + j; - - u[j + k*this->n + l*this->n*this->n] = this->work_u[ index ]; - } - } - } - return u; -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::insertSubgrid( VectorType u, const int i ) -{ - int idx, idy, idz; - idz = i / (this->gridRows*this->gridCols); - idy = (i % (this->gridRows*this->gridCols)) / this->gridCols; - idx = i % (this->gridCols); - - for( int j = 0; j < this->n; j++) - { - // int index = (i / this->gridCols)*this->n*this->n*this->gridCols + (i % this->gridCols)*this->n + (j/this->n)*this->n*this->gridCols + (j % this->n); - for( int k = 0; k < this->n; k++) - { - for( int l = 0; l < this->n; l++) - { - - int index = (idz*this->n + l) * this->n*this->n*this->gridCols*this->gridRows - + (idy) * this->n*this->n*this->gridCols - + (idx) * this->n - + k * this->n*this->gridCols - + j; - - //OMP LOCK index -// cout<< idx << " " << idy << " " << idz << " " << j << " " << k << " " << l << " " << idz << " " << unusedCell.getSize() << " " << u.getSize() << " " << index <<endl; - if( (fabs(this->work_u[index]) > fabs(u[j + k*this->n + l*this->n*this->n])) || (this->unusedCell[index] == 1) ) - { - this->work_u[index] = u[j + k*this->n + l*this->n*this->n]; - this->unusedCell[index] = 0; - } - //OMP UNLOCK index - } - } - } -} - -template< typename SchemeHost, typename SchemeDevice, typename Device> -typename tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::VectorType -tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::runSubgrid( int boundaryCondition, VectorType u, int subGridID) -{ - - VectorType fu; - - fu.setLike(u); - fu.setValue( 0.0 ); - - - bool tmp = false; - for(int i = 0; i < u.getSize(); i++) - { - if(u[0]*u[i] <= 0.0) - tmp=true; - } - int idx,idy,idz; - idz = subGridID / (this->gridRows*this->gridCols); - idy = (subGridID % (this->gridRows*this->gridCols)) / this->gridCols; - idx = subGridID % (this->gridCols); - int centerGID = (this->n*idy + (this->n>>1) )*(this->n*this->gridCols) + this->n*idx + (this->n>>1) - + ((this->n>>1)+this->n*idz)*this->n*this->n*this->gridRows*this->gridCols; - if(this->unusedCell[centerGID] == 0 || boundaryCondition == 0) - tmp = true; - //if(this->currentStep + 3 < getSubgridValue(subGridID)) - //tmp = true; - - - double value = sign(u[0]) * u.absMax(); - - if(tmp) - {} - - - //north - 1, east - 2, west - 4, south - 8 - else if(boundaryCondition == 4) - { - for(int i = 0; i < this->n; i++) - for(int j = 1;j < this->n; j++) - for(int k = 0;k < this->n; k++) - //if(fabs(u[i*this->n + j]) < fabs(u[i*this->n])) - u[k*this->n*this->n + i*this->n + j] = value;// u[i*this->n]; - } - else if(boundaryCondition == 2) - { - for(int i = 0; i < this->n; i++) - for(int j =0 ;j < this->n -1; j++) - for(int k = 0;k < this->n; k++) - //if(fabs(u[i*this->n + j]) < fabs(u[(i+1)*this->n - 1])) - u[k*this->n*this->n + i*this->n + j] = value;// u[(i+1)*this->n - 1]; - } - else if(boundaryCondition == 1) - { - for(int j = 0; j < this->n; j++) - for(int i = 0;i < this->n - 1; i++) - for(int k = 0;k < this->n; k++) - //if(fabs(u[i*this->n + j]) < fabs(u[j + this->n*(this->n - 1)])) - u[k*this->n*this->n + i*this->n + j] = value;// u[j + this->n*(this->n - 1)]; - } - else if(boundaryCondition == 8) - { - for(int j = 0; j < this->n; j++) - for(int i = 1;i < this->n; i++) - for(int k = 0;k < this->n; k++) - //if(fabs(u[i*this->n + j]) < fabs(u[j])) - u[k*this->n*this->n + i*this->n + j] = value;// u[j]; - } - else if(boundaryCondition == 16) - { - for(int j = 0; j < this->n; j++) - for(int i = 0;i < this->n ; i++) - for(int k = 0;k < this->n-1; k++) - //if(fabs(u[i*this->n + j]) < fabs(u[j + this->n*(this->n - 1)])) - u[k*this->n*this->n + i*this->n + j] = value;// u[j + this->n*(this->n - 1)]; - } - else if(boundaryCondition == 32) - { - for(int j = 0; j < this->n; j++) - for(int i = 0;i < this->n; i++) - for(int k = 1;k < this->n; k++) - //if(fabs(u[i*this->n + j]) < fabs(u[j])) - u[k*this->n*this->n + i*this->n + j] = value;// u[j]; - } - - - double time = 0.0; - double currentTau = this->tau0; - double finalTime = this->stopTime;// + 3.0*(u.max() - u.min()); - if(boundaryCondition == 0) finalTime *= 2.0; - if( time + currentTau > finalTime ) currentTau = finalTime - time; - - double maxResidue( 1.0 ); - //double lastResidue( 10000.0 ); - tnlGridEntity<MeshType, 3, tnlGridEntityNoStencilStorage > Entity(subMesh); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage >,3> neighborEntities(Entity); - while( time < finalTime /*|| maxResidue > subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*/) - { - /**** - * Compute the RHS - */ - - for( int i = 0; i < fu.getSize(); i ++ ) - { -// std::cout << "i: " << i << ", time: " << time <<endl; - Containers::StaticVector<3,int> coords(i % subMesh.getDimensions().x(), - (i % (subMesh.getDimensions().x()*subMesh.getDimensions().y())) / subMesh.getDimensions().x(), - i / (subMesh.getDimensions().x()*subMesh.getDimensions().y())); -// cout << "b " << i << " " << i % subMesh.getDimensions().x() << " " << (i % (subMesh.getDimensions().x()*subMesh.getDimensions().y())) << " " << (i % subMesh.getDimensions().x()*subMesh.getDimensions().y()) / subMesh.getDimensions().x() << " " << subMesh.getDimensions().x()*subMesh.getDimensions().y() << " " <<endl; - Entity.setCoordinates(coords); -// cout <<"c" << coords <<std::endl; - Entity.refresh(); -// cout << "d" <<endl; - neighborEntities.refresh(subMesh,Entity.getIndex()); -// cout << "e" <<endl; - fu[ i ] = schemeHost.getValue( this->subMesh, i, coords,u, time, boundaryCondition, neighborEntities ); -// std::cout << "f" <<endl; - } - maxResidue = fu. absMax(); - - - if( this -> cflCondition * maxResidue != 0.0) - currentTau = this -> cflCondition / maxResidue; - - /* if (maxResidue < 0.05) - std::cout << "Max < 0.05" <<std::endl;*/ - if(currentTau > 0.5 * this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()) - currentTau = 0.5 * this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >(); - /*if(maxResidue > lastResidue) - currentTau *=(1.0/10.0);*/ - - - if( time + currentTau > finalTime ) currentTau = finalTime - time; -// for( int i = 0; i < fu.getSize(); i ++ ) -// { -// //cout << "Too big RHS! i = " << i << ", fu = " << fu[i] << ", u = " << u[i] <<std::endl; -// if((u[i]+currentTau * fu[ i ])*u[i] < 0.0 && fu[i] != 0.0 && u[i] != 0.0 ) -// currentTau = fabs(u[i]/(2.0*fu[i])); -// -// } - - - for( int i = 0; i < fu.getSize(); i ++ ) - { - double add = u[i] + currentTau * fu[ i ]; - //if( fabs(u[i]) < fabs(add) or (this->subgridValues[subGridID] == this->currentStep +4) ) - u[ i ] = add; - } - time += currentTau; - - //cout << '\r' << flush; - //cout << maxResidue << " " << currentTau << " @ " << time << flush; - //lastResidue = maxResidue; - } - //cout << "Time: " << time << ", Res: " << maxResidue <<endl; - /*if (u.max() > 0.0) - this->stopTime /=(double) this->gridCols;*/ - -// VectorType solution; -// solution.setLike(u); -// for( int i = 0; i < u.getSize(); i ++ ) -// { -// solution[i]=u[i]; -// } -// return solution; - return u; -} - - -#ifdef HAVE_CUDA - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getSubgridCUDA3D( const int i ,tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* caller, double* a) -{ - //int j = threadIdx.x + threadIdx.y * blockDim.x; -// int index = (blockIdx.z*this->n + threadIdx.z) * this->n*this->n*this->gridCols*this->gridRows -// + (blockIdx.y) * this->n*this->n*this->gridCols -// + (blockIdx.x) * this->n -// + threadIdx.y * this->n*this->gridCols -// + threadIdx.x; - - - int index = blockDim.x*blockIdx.x + threadIdx.x + - (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + - (blockDim.z*blockIdx.z + threadIdx.z)*blockDim.x*gridDim.x*blockDim.y*gridDim.y; - - //printf("i= %d,j= %d,th= %d\n",i,j,th); - *a = caller->work_u_cuda[index]; - //printf("Hi %f \n", *a); - //return ret; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::updateSubgridCUDA3D( const int i ,tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* caller, double* a) -{ -// int j = threadIdx.x + threadIdx.y * blockDim.x; -// int index = (blockIdx.z*this->n + threadIdx.z) * this->n*this->n*this->gridCols*this->gridRows -// + (blockIdx.y) * this->n*this->n*this->gridCols -// + (blockIdx.x) * this->n -// + threadIdx.y * this->n*this->gridCols -// + threadIdx.x; - - int index = blockDim.x*blockIdx.x + threadIdx.x + - (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + - (blockDim.z*blockIdx.z + threadIdx.z)*blockDim.x*gridDim.x*blockDim.y*gridDim.y; - - if( (fabs(caller->work_u_cuda[index]) > fabs(*a)) || (caller->unusedCell_cuda[index] == 1) ) - { - caller->work_u_cuda[index] = *a; - caller->unusedCell_cuda[index] = 0; - - } - - *a = caller->work_u_cuda[index]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::insertSubgridCUDA3D( double u, const int i ) -{ - - -// int j = threadIdx.x + threadIdx.y * blockDim.x; - //printf("j = %d, u = %f\n", j,u); - -// int index = (blockIdx.z*this->n + threadIdx.z) * this->n*this->n*this->gridCols*this->gridRows -// + (blockIdx.y) * this->n*this->n*this->gridCols -// + (blockIdx.x) * this->n -// + threadIdx.y * this->n*this->gridCols -// + threadIdx.x; - - int index = blockDim.x*blockIdx.x + threadIdx.x + - (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + - (blockDim.z*blockIdx.z + threadIdx.z)*blockDim.x*gridDim.x*blockDim.y*gridDim.y; - - //printf("i= %d,j= %d,index= %d\n",i,j,index); - if( (fabs(this->work_u_cuda[index]) > fabs(u)) || (this->unusedCell_cuda[index] == 1) ) - { - this->work_u_cuda[index] = u; - this->unusedCell_cuda[index] = 0; - - } - - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::runSubgridCUDA3D( int boundaryCondition, double* u, int subGridID) -{ - - __shared__ int tmp; - __shared__ double value; - //double tmpRes = 0.0; - volatile double* sharedTau = &u[blockDim.x*blockDim.y*blockDim.z]; -// volatile double* absVal = &u[2*blockDim.x*blockDim.y*blockDim.z]; - int i = threadIdx.x; - int j = threadIdx.y; - int k = threadIdx.z; - int l = threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z*blockDim.x*blockDim.y; - bool computeFU = !((i == 0 && (boundaryCondition & 4)) or - (i == blockDim.x - 1 && (boundaryCondition & 2)) or - (j == 0 && (boundaryCondition & 8)) or - (j == blockDim.y - 1 && (boundaryCondition & 1))or - (k == 0 && (boundaryCondition & 32)) or - (k == blockDim.z - 1 && (boundaryCondition & 16))); - - if(l == 0) - { - tmp = 0; - int centerGID = (blockDim.y*blockIdx.y + (blockDim.y>>1) )*(blockDim.x*gridDim.x) + blockDim.x*blockIdx.x + (blockDim.x>>1) - + ((blockDim.z>>1)+blockDim.z*blockIdx.z)*blockDim.x*blockDim.y*gridDim.x*gridDim.y; - if(this->unusedCell_cuda[centerGID] == 0 || boundaryCondition == 0) - tmp = 1; - } - __syncthreads(); - - - __syncthreads(); - if(tmp !=1) - { -// if(computeFU) -// absVal[l]=0.0; -// else -// absVal[l] = fabs(u[l]); -// -// __syncthreads(); -// -// if((blockDim.x == 16) && (l < 128)) absVal[l] = Max(absVal[l],absVal[l+128]); -// __syncthreads(); -// if((blockDim.x == 16) && (l < 64)) absVal[l] = Max(absVal[l],absVal[l+64]); -// __syncthreads(); -// if(l < 32) absVal[l] = Max(absVal[l],absVal[l+32]); -// if(l < 16) absVal[l] = Max(absVal[l],absVal[l+16]); -// if(l < 8) absVal[l] = Max(absVal[l],absVal[l+8]); -// if(l < 4) absVal[l] = Max(absVal[l],absVal[l+4]); -// if(l < 2) absVal[l] = Max(absVal[l],absVal[l+2]); -// if(l < 1) value = sign(u[0])*Max(absVal[l],absVal[l+1]); -// __syncthreads(); -// -// if(computeFU) -// u[l] = value; - if(computeFU) - { - tnlGridEntity<MeshType, 3, tnlGridEntityNoStencilStorage > Ent(subMesh); - if(boundaryCondition == 4) - { - Ent.setCoordinates(Containers::StaticVector<3,int>(0,j,k)); - Ent.refresh(); - u[l] = u[Ent.getIndex()];// + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*(threadIdx.x) ;//+ 2*sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*(threadIdx.x+this->n); - } - else if(boundaryCondition == 2) - { - Ent.setCoordinates(Containers::StaticVector<3,int>(blockDim.x - 1,j,k)); - Ent.refresh(); - u[l] = u[Ent.getIndex()];// + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*(this->n - 1 - threadIdx.x);//+ 2*sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*(blockDim.x - threadIdx.x - 1+this->n); - } - else if(boundaryCondition == 8) - { - Ent.setCoordinates(Containers::StaticVector<3,int>(i,0,k)); - Ent.refresh(); - u[l] = u[Ent.getIndex()];// + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 0, 1, 0 >()*(threadIdx.y) ;//+ 2*sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*(threadIdx.y+this->n); - } - else if(boundaryCondition == 1) - { - Ent.setCoordinates(Containers::StaticVector<3,int>(i,blockDim.y - 1,k)); - Ent.refresh(); - u[l] = u[Ent.getIndex()];// + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 0, 1, 0 >()*(this->n - 1 - threadIdx.y) ;//+ sign(u[0])*this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()*(blockDim.y - threadIdx.y - 1 +this->n); - } - else if(boundaryCondition == 32) - { - Ent.setCoordinates(Containers::StaticVector<3,int>(i,j,0)); - Ent.refresh(); - u[l] = u[Ent.getIndex()];// + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 0, 0, 1 >()*(threadIdx.z); - } - else if(boundaryCondition == 16) - { - Ent.setCoordinates(Containers::StaticVector<3,int>(i,j,blockDim.z - 1)); - Ent.refresh(); - u[l] = u[Ent.getIndex()];// + sign(u[0])*this->subMesh.template getSpaceStepsProducts< 0, 0, 1 >()*(this->n - 1 - threadIdx.z) ; - } - } - } - - double time = 0.0; - __shared__ double currentTau; - double cfl = this->cflCondition; - double fu = 0.0; -// if(threadIdx.x * threadIdx.y * threadIdx.z == 0) -// { -// currentTau = this->tau0; -// } - double finalTime = this->stopTime; - __syncthreads(); - if( boundaryCondition == 0 ) finalTime *= 2.0; - - tnlGridEntity<MeshType, 3, tnlGridEntityNoStencilStorage > Entity(subMesh); - tnlNeighborGridEntityGetter<tnlGridEntity< MeshType, 3, tnlGridEntityNoStencilStorage >,3> neighborEntities(Entity); - Entity.setCoordinates(Containers::StaticVector<3,int>(i,j,k)); - Entity.refresh(); - neighborEntities.refresh(subMesh,Entity.getIndex()); - - - while( time < finalTime ) - { - sharedTau[l]=finalTime; - - if(computeFU) - { - fu = schemeHost.getValueDev( this->subMesh, l, Containers::StaticVector<3,int>(i,j,k), u, time, boundaryCondition, neighborEntities); - if(abs(fu) > 0.0) - sharedTau[l]=abs(cfl/fu); - } - - if(l == 0) - { - if(sharedTau[0] > 0.5 * this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >()) sharedTau[0] = 0.5 * this->subMesh.template getSpaceStepsProducts< 1, 0, 0 >(); - } - else if(l == blockDim.x*blockDim.y*blockDim.z - 1) - { - if( time + sharedTau[l] > finalTime ) sharedTau[l] = finalTime - time; - } - - __syncthreads(); - if(l < 256) sharedTau[l] = Min(sharedTau[l],sharedTau[l+256]); - __syncthreads(); - if(l < 128) sharedTau[l] = Min(sharedTau[l],sharedTau[l+128]); - __syncthreads(); - if(l < 64) sharedTau[l] = Min(sharedTau[l],sharedTau[l+64]); - __syncthreads(); - if(l < 32) sharedTau[l] = Min(sharedTau[l],sharedTau[l+32]); - __syncthreads(); - if(l < 16) sharedTau[l] = Min(sharedTau[l],sharedTau[l+16]); - if(l < 8) sharedTau[l] = Min(sharedTau[l],sharedTau[l+8]); - if(l < 4) sharedTau[l] = Min(sharedTau[l],sharedTau[l+4]); - if(l < 2) sharedTau[l] = Min(sharedTau[l],sharedTau[l+2]); - if(l < 1) currentTau = Min(sharedTau[l],sharedTau[l+1]); - __syncthreads(); - -// if(abs(fu) < 10000.0) -// printf("bla"); - if(computeFU) - u[l] += currentTau * fu; - time += currentTau; - __syncthreads(); - } - - -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getOwnerCUDA3D(int i) const -{ - int j = i % (this->gridCols*this->gridRows*this->n*this->n); - - return ( (i / (this->gridCols*this->gridRows*this->n*this->n))*this->gridCols*this->gridRows - + (j / (this->gridCols*this->n*this->n))*this->gridCols - + (j % (this->gridCols*this->n))/this->n); -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getSubgridValueCUDA3D( int i ) const -{ - return this->subgridValues_cuda[i]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::setSubgridValueCUDA3D(int i, int value) -{ - this->subgridValues_cuda[i] = value; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -int tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::getBoundaryConditionCUDA3D( int i ) const -{ - return this->boundaryConditions_cuda[i]; -} - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__device__ -void tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::setBoundaryConditionCUDA3D(int i, int value) -{ - this->boundaryConditions_cuda[i] = value; -} - - - -//north - 1, east - 2, west - 4, south - 8, up -16, down - 32 - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void /*tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int>::*/synchronizeCUDA3D(tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver) //needs fix ---- maybe not anymore --- but frankly: yeah, it does -- aaaa-and maybe fixed now -{ - - __shared__ int boundary[6]; // north,east,west,south - __shared__ int subgridValue; - __shared__ int newSubgridValue; - - - int gid = blockDim.x*blockIdx.x + threadIdx.x + - (blockDim.y*blockIdx.y + threadIdx.y)*blockDim.x*gridDim.x + - (blockDim.z*blockIdx.z + threadIdx.z)*blockDim.x*gridDim.x*blockDim.y*gridDim.y; - double u = cudaSolver->work_u_cuda[gid]; - double u_cmp; - int subgridValue_cmp=INT_MAX; - int boundary_index=0; - - - if(threadIdx.x+threadIdx.y+threadIdx.z == 0) - { - subgridValue = cudaSolver->getSubgridValueCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y); - boundary[0] = 0; - boundary[1] = 0; - boundary[2] = 0; - boundary[3] = 0; - boundary[4] = 0; - boundary[5] = 0; - newSubgridValue = 0; -// printf("aaa z = %d, y = %d, x = %d\n",blockIdx.z,blockIdx.y,blockIdx.x); - } - __syncthreads(); - - - - if( (threadIdx.x == 0 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.y == 0 /* && (cudaSolver->currentStep & 1)*/) || - (threadIdx.z == 0 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.x == blockDim.x - 1 /* && !(cudaSolver->currentStep & 1)*/) || - (threadIdx.y == blockDim.y - 1 /* && (cudaSolver->currentStep & 1)*/) || - (threadIdx.z == blockDim.z - 1 /* && (cudaSolver->currentStep & 1)*/) ) - { - if(threadIdx.x == 0 && (blockIdx.x != 0)/* && !(cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - 1]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y - 1); - boundary_index = 2; - } - - if(threadIdx.x == blockDim.x - 1 && (blockIdx.x != gridDim.x - 1)/* && !(cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + 1]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y + 1); - boundary_index = 1; - } - - __threadfence(); - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - u=u_cmp; - } - __threadfence(); - if(threadIdx.y == 0 && (blockIdx.y != 0)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - blockDim.x*gridDim.x]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA3D((blockIdx.y - 1)*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y); - boundary_index = 3; - } - if(threadIdx.y == blockDim.y - 1 && (blockIdx.y != gridDim.y - 1)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + blockDim.x*gridDim.x]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA3D((blockIdx.y + 1)*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y); - boundary_index = 0; - } - - __threadfence(); - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - u=u_cmp; - } - __threadfence(); - - if(threadIdx.z == 0 && (blockIdx.z != 0)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid - blockDim.x*gridDim.x*blockDim.y*gridDim.y]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + (blockIdx.z - 1)*gridDim.x*gridDim.y); - boundary_index = 5; - } - if(threadIdx.z == blockDim.z - 1 && (blockIdx.z != gridDim.z - 1)/* && (cudaSolver->currentStep & 1)*/) - { - u_cmp = cudaSolver->work_u_cuda[gid + blockDim.x*gridDim.x*blockDim.y*gridDim.y]; - subgridValue_cmp = cudaSolver->getSubgridValueCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + (blockIdx.z + 1)*gridDim.x*gridDim.y); - boundary_index = 4; - } - __threadfence(); - - if((subgridValue == INT_MAX || fabs(u_cmp) + cudaSolver->delta < fabs(u) ) && (subgridValue_cmp != INT_MAX && subgridValue_cmp != -INT_MAX)) - { - cudaSolver->unusedCell_cuda[gid] = 0; - atomicMax(&newSubgridValue, INT_MAX); - atomicMax(&boundary[boundary_index], 1); - cudaSolver->work_u_cuda[gid] = u_cmp; - } - __threadfence(); - - } - __syncthreads(); - - if(threadIdx.x+threadIdx.y+threadIdx.z == 0) - { - - if(subgridValue == INT_MAX && newSubgridValue != 0) - cudaSolver->setSubgridValueCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y, -INT_MAX); - - cudaSolver->setBoundaryConditionCUDA3D(blockIdx.y*gridDim.x + blockIdx.x + blockIdx.z*gridDim.x*gridDim.y, 1 * boundary[0] + - 2 * boundary[1] + - 4 * boundary[2] + - 8 * boundary[3] + - 16 * boundary[4] + - 32 * boundary[5] ); - if(blockIdx.x+blockIdx.y+blockIdx.z == 0) - { - cudaSolver->currentStep = cudaSolver->currentStep + 1; - *(cudaSolver->runcuda) = 0; - } - } -} - - - -template <typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void synchronize2CUDA3D(tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver) -{ - int stepValue = cudaSolver->currentStep + 4; - if( cudaSolver->getSubgridValueCUDA3D(blockIdx.z*gridDim.x*gridDim.y + blockIdx.y*gridDim.x + blockIdx.x) == -INT_MAX ) - cudaSolver->setSubgridValueCUDA3D(blockIdx.z*gridDim.x*gridDim.y + blockIdx.y*gridDim.x + blockIdx.x, stepValue); - - atomicMax((cudaSolver->runcuda),cudaSolver->getBoundaryConditionCUDA3D(blockIdx.z*gridDim.x*gridDim.y + blockIdx.y*gridDim.x + blockIdx.x)); -} - - - - - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device> -__global__ -void initCUDA3D( tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* cudaSolver, double* ptr , int* ptr2, int* ptr3) -{ - - - cudaSolver->work_u_cuda = ptr;//(double*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->n*cudaSolver->n*sizeof(double)); - cudaSolver->unusedCell_cuda = ptr3;//(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->n*cudaSolver->n*sizeof(int)); - cudaSolver->subgridValues_cuda =(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->gridLevels*sizeof(int)); - cudaSolver->boundaryConditions_cuda =(int*)malloc(cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->gridLevels*sizeof(int)); - cudaSolver->runcuda = ptr2;//(bool*)malloc(sizeof(bool)); - *(cudaSolver->runcuda) = 1; - cudaSolver->currentStep = 1; - //cudaMemcpy(ptr,&(cudaSolver->work_u_cuda), sizeof(double*),cudaMemcpyDeviceToHost); - //ptr = cudaSolver->work_u_cuda; - printf("GPU memory allocated.\n"); - - for(int i = 0; i < cudaSolver->gridCols*cudaSolver->gridRows*cudaSolver->gridLevels; i++) - { - cudaSolver->subgridValues_cuda[i] = INT_MAX; - cudaSolver->boundaryConditions_cuda[i] = 0; - } - - /*for(long int j = 0; j < cudaSolver->n*cudaSolver->n*cudaSolver->gridCols*cudaSolver->gridRows; j++) - { - printf("%d\n",j); - cudaSolver->unusedCell_cuda[ j] = 1; - }*/ - printf("GPU memory initialized.\n"); -} - - - - -//extern __shared__ double array[]; -template< typename SchemeHost, typename SchemeDevice, typename Device > -__global__ -void initRunCUDA3D(tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* caller) - -{ - - - extern __shared__ double u[]; - - int i = blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x; - int l = threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x; - - __shared__ int containsCurve; - if(l == 0) - { -// printf("z = %d, y = %d, x = %d\n",blockIdx.z,blockIdx.y,blockIdx.x); - containsCurve = 0; - } - - caller->getSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - if(u[0] * u[l] <= 0.0) - { - atomicMax( &containsCurve, 1); - } - - __syncthreads(); - if(containsCurve == 1) - { - caller->runSubgridCUDA3D(0,u,i); - __syncthreads(); -// caller->insertSubgridCUDA3D(u[l],i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - - __syncthreads(); - if(l == 0) - caller->setSubgridValueCUDA3D(i, 4); - } - - -} - - - - - -template< typename SchemeHost, typename SchemeDevice, typename Device > -__global__ -void runCUDA3D(tnlParallelEikonalSolver<3,SchemeHost, SchemeDevice, Device, double, int >* caller) -{ - extern __shared__ double u[]; - int i = blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x; - int l = threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x; - int bound = caller->getBoundaryConditionCUDA3D(i); - - if(caller->getSubgridValueCUDA3D(i) != INT_MAX && bound != 0 && caller->getSubgridValueCUDA3D(i) > 0) - { - caller->getSubgridCUDA3D(i,caller, &u[l]); - - //if(l == 0) - //printf("i = %d, bound = %d\n",i,caller->getSubgridValueCUDA3D(i)); - if(caller->getSubgridValueCUDA3D(i) == caller->currentStep+4) - { - if(bound & 1) - { - caller->runSubgridCUDA3D(1,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 2 ) - { - caller->runSubgridCUDA3D(2,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 4) - { - caller->runSubgridCUDA3D(4,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 8) - { - caller->runSubgridCUDA3D(8,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 16) - { - caller->runSubgridCUDA3D(16,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound & 32) - { - caller->runSubgridCUDA3D(32,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - - } - else - { - if( ((bound == 2))) - { - caller->runSubgridCUDA3D(2,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound == 1) )) - { - caller->runSubgridCUDA3D(1,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound == 8) )) - { - caller->runSubgridCUDA3D(8,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if((bound == 4)) - { - caller->runSubgridCUDA3D(4,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound == 16) - { - caller->runSubgridCUDA3D(16,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if(bound == 32) - { - caller->runSubgridCUDA3D(32,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - } - /* 1 2 4 8 16 32 */ - - if( ((bound & 19 ))) /* 1 1 0 0 1 0 */ - { - caller->runSubgridCUDA3D(19,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 21 ))) /* 1 0 1 0 1 0 */ - { - caller->runSubgridCUDA3D(21,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 26 ))) /* 0 1 0 1 1 0 */ - { - caller->runSubgridCUDA3D(26,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( (bound & 28 )) /* 0 0 1 1 1 0 */ - { - caller->runSubgridCUDA3D(28,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - - - - if( ((bound & 35 ))) /* 1 0 1 0 0 1 */ - { - caller->runSubgridCUDA3D(35,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 37 ))) /* 1 0 1 0 0 1 */ - { - caller->runSubgridCUDA3D(37,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( ((bound & 42 ))) /* 0 1 0 1 0 1 */ - { - caller->runSubgridCUDA3D(42,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - if( (bound & 44 )) /* 0 0 1 1 0 1 */ - { - caller->runSubgridCUDA3D(44,u,i); - caller->updateSubgridCUDA3D(i,caller, &u[l]); - __syncthreads(); - } - - if(l==0) - { - caller->setBoundaryConditionCUDA3D(i, 0); - caller->setSubgridValueCUDA3D(i, caller->getSubgridValueCUDA3D(i) - 1 ); - } - - - } - - - -} - -#endif /*HAVE_CUDA*/ - -#endif /* TNLPARALLELEIKONALSOLVER3D_IMPL_H_ */ diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/MainBuildConfig.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/MainBuildConfig.h index f8f9187fa514cc9d836bc8072a7adbfddd5f8216..a2a1d7372caadb2ec725a1051e3b9975d0fa82df 100644 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/MainBuildConfig.h +++ b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/MainBuildConfig.h @@ -23,7 +23,7 @@ namespace Solvers { /**** * Turn off support for float and long double. */ -template<> struct ConfigTagReal< HamiltonJacobiBuildConfig, float > { enum { enabled = false }; }; +template<> struct ConfigTagReal< HamiltonJacobiBuildConfig, float > { enum { enabled = true }; }; template<> struct ConfigTagReal< HamiltonJacobiBuildConfig, long double > { enum { enabled = false }; }; /**** diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase.h index b981a92a8cb5c7d495736ab1c12cb4b891167bee..f712ce2cc9ff3de5701a8550722b8904d33c4229 100644 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase.h +++ b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase.h @@ -19,92 +19,112 @@ class tnlDirectEikonalMethodsBase }; template< typename Real, - typename Device, - typename Index > + typename Device, + typename Index > class tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > { - public: - - typedef Meshes::Grid< 1, Real, Device, Index > MeshType; - typedef Real RealType; - typedef Device DevcieType; - typedef Index IndexType; - typedef Functions::MeshFunction< MeshType > MeshFunctionType; - typedef Functions::MeshFunction< MeshType, 1, bool > InterfaceMapType; - using MeshFunctionPointer = Pointers::SharedPointer< MeshFunctionType >; - using InterfaceMapPointer = Pointers::SharedPointer< InterfaceMapType >; - - void initInterface( const MeshFunctionPointer& input, - MeshFunctionPointer& output, - InterfaceMapPointer& interfaceMap ); - - template< typename MeshEntity > - __cuda_callable__ void updateCell( MeshFunctionType& u, - const MeshEntity& cell, - const RealType velocity = 1.0 ); - - __cuda_callable__ bool updateCell( volatile Real sArray[18], - int thri, const Real h, - const Real velocity = 1.0 ); + public: + + typedef Meshes::Grid< 1, Real, Device, Index > MeshType; + typedef Real RealType; + typedef Device DevcieType; + typedef Index IndexType; + typedef Functions::MeshFunction< MeshType > MeshFunctionType; + typedef Functions::MeshFunction< MeshType, 1, bool > InterfaceMapType; + using MeshFunctionPointer = Pointers::SharedPointer< MeshFunctionType >; + using InterfaceMapPointer = Pointers::SharedPointer< InterfaceMapType >; + + void initInterface( const MeshFunctionPointer& input, + MeshFunctionPointer& output, + InterfaceMapPointer& interfaceMap ); + + template< typename MeshEntity > + __cuda_callable__ void updateCell( MeshFunctionType& u, + const MeshEntity& cell, + const RealType velocity = 1.0 ); + + __cuda_callable__ bool updateCell( volatile Real sArray[18], + int thri, const Real h, + const Real velocity = 1.0 ); }; template< typename Real, - typename Device, - typename Index > + typename Device, + typename Index > class tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > { - public: - typedef Meshes::Grid< 2, Real, Device, Index > MeshType; - typedef Real RealType; - typedef Device DevcieType; - typedef Index IndexType; - typedef Functions::MeshFunction< MeshType > MeshFunctionType; - typedef Functions::MeshFunction< MeshType, 2, bool > InterfaceMapType; - using MeshFunctionPointer = Pointers::SharedPointer< MeshFunctionType >; - using InterfaceMapPointer = Pointers::SharedPointer< InterfaceMapType >; - - void initInterface( const MeshFunctionPointer& input, - MeshFunctionPointer& output, - InterfaceMapPointer& interfaceMap ); - - template< typename MeshEntity > - __cuda_callable__ void updateCell( MeshFunctionType& u, - const MeshEntity& cell, - const RealType velocity = 1.0 ); - - __cuda_callable__ bool updateCell( volatile Real sArray[18][18], - int thri, int thrj, const Real hx, const Real hy, - const Real velocity = 1.0 ); + public: + typedef Meshes::Grid< 2, Real, Device, Index > MeshType; + typedef Real RealType; + typedef Device DevcieType; + typedef Index IndexType; + typedef Functions::MeshFunction< MeshType > MeshFunctionType; + typedef Functions::MeshFunction< MeshType, 2, bool > InterfaceMapType; + typedef TNL::Containers::Array< int, Device, IndexType > ArrayContainer; + using MeshFunctionPointer = Pointers::SharedPointer< MeshFunctionType >; + using InterfaceMapPointer = Pointers::SharedPointer< InterfaceMapType >; + + void initInterface( const MeshFunctionPointer& input, + MeshFunctionPointer& output, + InterfaceMapPointer& interfaceMap ); + + template< typename MeshEntity > + __cuda_callable__ void updateCell( MeshFunctionType& u, + const MeshEntity& cell, + const RealType velocity = 1.0 ); + + template< int sizeSArray > + __cuda_callable__ bool updateCell( volatile Real *sArray, + int thri, int thrj, const Real hx, const Real hy, + const Real velocity = 1.0 ); + + template< int sizeSArray > + void updateBlocks( InterfaceMapType interfaceMap, + MeshFunctionType aux, + MeshFunctionType helpFunc, + ArrayContainer BlockIterHost, int numThreadsPerBlock/*, Real **sArray*/ ); + + void getNeighbours( ArrayContainer BlockIterHost, int numBlockX, int numBlockY ); }; template< typename Real, - typename Device, - typename Index > + typename Device, + typename Index > class tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > { - public: - typedef Meshes::Grid< 3, Real, Device, Index > MeshType; - typedef Real RealType; - typedef Device DevcieType; - typedef Index IndexType; - typedef Functions::MeshFunction< MeshType > MeshFunctionType; - typedef Functions::MeshFunction< MeshType, 3, bool > InterfaceMapType; - using MeshFunctionPointer = Pointers::SharedPointer< MeshFunctionType >; - using InterfaceMapPointer = Pointers::SharedPointer< InterfaceMapType >; - - void initInterface( const MeshFunctionPointer& input, - MeshFunctionPointer& output, - InterfaceMapPointer& interfaceMap ); - - template< typename MeshEntity > - __cuda_callable__ void updateCell( MeshFunctionType& u, - const MeshEntity& cell, - const RealType velocity = 1.0); - - __cuda_callable__ bool updateCell( volatile Real sArray[10][10][10], - int thri, int thrj, int thrk, const Real hx, const Real hy, const Real hz, - const Real velocity = 1.0 ); + public: + typedef Meshes::Grid< 3, Real, Device, Index > MeshType; + typedef Real RealType; + typedef Device DevcieType; + typedef Index IndexType; + typedef Functions::MeshFunction< MeshType > MeshFunctionType; + typedef Functions::MeshFunction< MeshType, 3, bool > InterfaceMapType; + typedef TNL::Containers::Array< int, Device, IndexType > ArrayContainer; + using MeshFunctionPointer = Pointers::SharedPointer< MeshFunctionType >; + using InterfaceMapPointer = Pointers::SharedPointer< InterfaceMapType >; + + void initInterface( const MeshFunctionPointer& input, + MeshFunctionPointer& output, + InterfaceMapPointer& interfaceMap ); + + template< typename MeshEntity > + __cuda_callable__ void updateCell( MeshFunctionType& u, + const MeshEntity& cell, + const RealType velocity = 1.0); + + template< int sizeSArray > + void updateBlocks( const InterfaceMapType interfaceMap, + const MeshFunctionType aux, + MeshFunctionType& helpFunc, + ArrayContainer BlockIterHost, int numThreadsPerBlock/*, Real **sArray*/ ); + + void getNeighbours( ArrayContainer BlockIterHost, int numBlockX, int numBlockY, int numBlockZ ); + + template< int sizeSArray > + __cuda_callable__ bool updateCell3D( volatile Real *sArray, + int thri, int thrj, int thrk, const Real hx, const Real hy, const Real hz, + const Real velocity = 1.0 ); }; template < typename T1, typename T2 > @@ -113,44 +133,54 @@ T1 meet2DCondition( T1 a, T1 b, const T2 ha, const T2 hb, const T1 value, double template < typename T1 > __cuda_callable__ void sortMinims( T1 pom[] ); - #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 ); + Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index > >& output, + Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index >, 1, bool >& interfaceMap ); template < typename Real, typename Device, typename Index > __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > ptr, - const Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index >, 1, bool >& interfaceMap, - Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index > >& aux, - bool *BlockIterDevice ); + const Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index >, 1, bool >& interfaceMap, + Functions::MeshFunction< Meshes::Grid< 1, Real, Device, Index > >& aux, + bool *BlockIterDevice ); -template < typename Real, typename Device, typename Index > +template < int sizeSArray, typename Real, typename Device, typename Index > __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > ptr, - const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap, - Real *aux, - int *BlockIterDevice); -__global__ void CudaParallelReduc( int *BlockIterDevice, int *dBlock, int nBlocks ); + const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap, + const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& aux, + Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& helpFunc, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, int oddEvenBlock =0); -template < typename Real, typename Device, typename Index > -__global__ void aux1( Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& aux, Real *dAux, int a ); +template < typename Index > +__global__ void CudaParallelReduc( TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, + TNL::Containers::Array< int, Devices::Cuda, Index > dBlock, int nBlocks ); + +template < typename Index > +__global__ void GetNeighbours( TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterPom, int numBlockX, int numBlockY ); 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 ); + Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& output, + Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap ); 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 ); + Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& output, + Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap ); -template < typename Real, typename Device, typename Index > +template < int sizeSArray, typename Real, typename Device, typename Index > __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > ptr, - const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap, - Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& aux, - int *BlockIterDevice ); + const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap, + const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& aux, + Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& helpFunc, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice ); + +template < typename Index > +__global__ void GetNeighbours3D( TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterPom, + int numBlockX, int numBlockY, int numBlockZ ); #endif #include "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 index 649a5ad43a3041fcd479ab7828f7fb1a85634b1c..8f7937541d4708f519cd73a1cb50f0b582fbad48 100644 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase_impl.h +++ b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlDirectEikonalMethodsBase_impl.h @@ -1,4 +1,4 @@ - /* +/* * File: tnlDirectEikonalMethodsBase_impl.h * Author: oberhuber * @@ -11,1061 +11,1649 @@ #include <iostream> #include "tnlFastSweepingMethod.h" +#include "tnlDirectEikonalMethodsBase.h" template< typename Real, - typename Device, - typename Index > + typename Device, + typename Index > void tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > >:: initInterface( const MeshFunctionPointer& _input, - MeshFunctionPointer& _output, - InterfaceMapPointer& _interfaceMap ) + MeshFunctionPointer& _output, + InterfaceMapPointer& _interfaceMap ) { - if( std::is_same< Device, Devices::Cuda >::value ) - { + 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; + 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; + } + 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; - } + { + 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( int 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( int thri = 0; thri < sizeSArray; thri++ ){ + for( int thrj = 0; thrj < sizeSArray; thrj++ ) + sArray[ thri * sizeSArray + thrj ] = std::numeric_limits< Real >::max(); + } + + + //printf("numThreadsPerBlock = %d\n", numThreadsPerBlock); + for( int 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 ]; - const RealType& h = mesh.getSpaceSteps().x(); - for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh.getDimensions().x() - 1; - cell.getCoordinates().x() ++ ) + 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( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int k = 0; k < numThreadsPerBlock; k++ ) + for( int 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( int k = numThreadsPerBlock-1; k > -1; k-- ) + for( int 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( int k = numThreadsPerBlock-1; k > -1; k-- ){ + for( int 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( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int 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( int k = 0; k < sizeSArray; k++ ) + for( int l = 0; l < sizeSArray; l++ ) + for( int m = 0; m < sizeSArray; m++ ){ + sArray[ m * sizeSArray * sizeSArray + k * sizeSArray + l ] = std::numeric_limits< Real >::max(); + } + + + for( int thrk = 0; thrk < numThreadsPerBlock; thrk++ ) + for( int thrj = 0; thrj < numThreadsPerBlock; thrj++ ) { - 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 ) + 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( int m = 0; m < numThreadsPerBlock; m++ ){ + for( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int m = 0; m < numThreadsPerBlock; m++ ){ + for( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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 ] ) { - 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; + //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( int m = numThreadsPerBlock-1; m >-1; m-- ){ + for( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int m = 0; m < numThreadsPerBlock; m++ ){ + for( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int m = numThreadsPerBlock-1; m >-1; m-- ){ + for( int k = 0; k < numThreadsPerBlock; k++ ){ + for( int 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( int m = 0; m < numThreadsPerBlock; m++ ){ + for( int k = numThreadsPerBlock-1; k > -1; k-- ){ + for( int 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( int m = numThreadsPerBlock-1; m >-1; m-- ){ + for( int k = numThreadsPerBlock-1; k > -1; k-- ){ + for( int 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( int m = 0; m < numThreadsPerBlock; m++ ){ + for( int k = numThreadsPerBlock-1; k > -1; k-- ){ + for( int 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( int m = numThreadsPerBlock-1; m >-1; m-- ){ + for( int k = numThreadsPerBlock-1; k > -1; k-- ){ + for( int 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( 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[ 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 > + 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 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 ); + 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 > + typename Device, + typename Index > void tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >:: initInterface( const MeshFunctionPointer& _input, - MeshFunctionPointer& _output, - InterfaceMapPointer& _interfaceMap ) + MeshFunctionPointer& _output, + InterfaceMapPointer& _interfaceMap ) { - - if( std::is_same< Device, Devices::Cuda >::value ) - { + + 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 >() ); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; + 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 >() ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; #endif - } - if( std::is_same< Device, Devices::Host >::value ) - { - MeshFunctionType input = _input.getData(); - - /*double A[320][320]; - std::ifstream fileInit("/home/maty/Downloads/initData.txt"); - - for (int i = 0; i < 320; i++) - for (int j = 0; j < 320; j++) - fileInit >> A[i][j]; - fileInit.close(); - for (int i = 0; i < 320; i++) - for (int j = 0; j < 320; j++) - input[i*320 + j] = A[i][j];*/ - - - MeshFunctionType& output = _output.modifyData(); - InterfaceMapType& interfaceMap = _interfaceMap.modifyData(); - const MeshType& mesh = input.getMesh(); - 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; + } + if( std::is_same< Device, Devices::Host >::value ) + { + MeshFunctionType input = _input.getData(); + + /*double A[320][320]; + std::ifstream fileInit("/home/maty/Downloads/initData.txt"); + + for (int i = 0; i < 320; i++) + for (int j = 0; j < 320; j++) + fileInit >> A[j]; + fileInit.close(); + for (int i = 0; i < 320; i++) + for (int j = 0; j < 320; j++) + input[i*320 + j] = A[j];*/ + + + MeshFunctionType& output = _output.modifyData(); + InterfaceMapType& interfaceMap = _interfaceMap.modifyData(); + const MeshType& mesh = input.getMesh(); + 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; cell.getCoordinates().y() < mesh.getDimensions().y(); cell.getCoordinates().y() ++ ) - for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh.getDimensions().x(); - cell.getCoordinates().x() ++ ) + for( cell.getCoordinates().x() = 0; + cell.getCoordinates().x() < mesh.getDimensions().x(); + 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 ) { - cell.refresh(); - const RealType& c = input( cell ); - if( ! cell.isBoundaryEntity() ) + /*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 { - 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; - } - } + 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; + } + } } + } } template< typename Real, - typename Device, - typename Index > - template< typename MeshEntity > + typename Device, + typename Index > +template< typename MeshEntity > __cuda_callable__ void tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > >:: updateCell( MeshFunctionType& u, - const MeshEntity& cell, - const RealType v) + 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; - /*if( fabs( a ) == TypeInfo< Real >::getMaxValue() || - fabs( b ) == TypeInfo< Real >::getMaxValue() || - fabs( a - b ) >= TNL::sqrt( (hx * hx + hy * hy)/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; + /*if( fabs( a ) == TypeInfo< Real >::getMaxValue() || + fabs( b ) == TypeInfo< Real >::getMaxValue() || + fabs( a - b ) >= TNL::sqrt( (hx * hx + hy * hy)/v ) ) { - tmp = - fabs( a ) >= fabs( b ) ? b + TNL::sign( value ) * hy : - a + TNL::sign( value ) * hx; + tmp = + fabs( a ) >= fabs( b ) ? b + TNL::sign( value ) * hy : + a + TNL::sign( value ) * hx; }*/ - /*if( fabs( a ) != TypeInfo< Real >::getMaxValue() && - fabs( b ) != TypeInfo< Real >::getMaxValue() && - fabs( a - b ) < TNL::sqrt( (hx * hx + hy * hy)/v ) ) + /*if( fabs( a ) != TypeInfo< Real >::getMaxValue() && + fabs( b ) != TypeInfo< Real >::getMaxValue() && + fabs( a - b ) < TNL::sqrt( (hx * hx + hy * hy)/v ) ) { - tmp = ( hx * hx * b + hy * hy * a + - sign( value ) * hx * hy * TNL::sqrt( ( hx * hx + hy * hy )/v - - ( a - b ) * ( a - b ) ) )/( hx * hx + hy * hy ); - u[ cell.getIndex() ] = tmp; + tmp = ( hx * hx * b + hy * hy * a + + sign( value ) * hx * hy * TNL::sqrt( ( hx * hx + hy * hy )/v - + ( a - b ) * ( a - b ) ) )/( hx * hx + hy * hy ); + u[ cell.getIndex() ] = tmp; } else { - tmp = - fabs( a ) > fabs( b ) ? b + TNL::sign( value ) * hy/v : - a + TNL::sign( value ) * hx/v; - u[ cell.getIndex() ] = argAbsMin( value, tmp ); - //tmp = TypeInfo< RealType >::getMaxValue(); + tmp = + fabs( a ) > fabs( b ) ? b + TNL::sign( value ) * hy/v : + a + TNL::sign( value ) * hx/v; + u[ cell.getIndex() ] = argAbsMin( value, tmp ); + //tmp = TypeInfo< RealType >::getMaxValue(); }*/ - 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 ); - else - { - tmp = ( pom[ 3 ] * pom[ 3 ] * pom[ 1 ] + pom[ 4 ] * pom[ 4 ] * pom[ 0 ] + + 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 ); + 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 ); - } + u[ cell.getIndex() ] = argAbsMin( value, tmp ); + } } template< typename Real, - typename Device, - typename Index > + typename Device, + typename Index > void tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >:: initInterface( const MeshFunctionPointer& _input, - MeshFunctionPointer& _output, - InterfaceMapPointer& _interfaceMap ) + MeshFunctionPointer& _output, + InterfaceMapPointer& _interfaceMap ) { - if( std::is_same< Device, Devices::Cuda >::value ) - { + 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 >() ); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; + 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 >() ); + 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; - 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() ++ ) + } + 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 ? 10://std::numeric_limits< RealType >::max() : + -10;//- 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; + 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(); + 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 >(); + //Try exact initiation + /*const IndexType w = neighbors.template getEntityIndex< -1, 0, 0 >(); + const IndexType s = neighbors.template getEntityIndex< 0, -1, 0 >(); + const IndexType b = neighbors.template getEntityIndex< 0, 0, -1 >(); + if( c * input[ e ] <= 0 ) + { + output[ cell.getIndex() ] = c; + output[ e ] = input[ e ]; + interfaceMap[ e ] = true; + interfaceMap[ cell.getIndex() ] = true; + } + else if( c * input[ n ] <= 0 ) + { + output[ cell.getIndex() ] = c; + output[ n ] = input[ n ]; + interfaceMap[ n ] = true; + interfaceMap[ cell.getIndex() ] = true; + } + else if( c * input[ t ] <= 0 ) + { + output[ cell.getIndex() ] = c; + output[ t ] = input[ t ]; + interfaceMap[ t ] = true; + interfaceMap[ cell.getIndex() ] = true; + }*/ + if( c * input[ n ] <= 0 ) + { + if( c >= 0 ) { - 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 >(); - //Try exact initiation - /*const IndexType w = neighbors.template getEntityIndex< -1, 0, 0 >(); - const IndexType s = neighbors.template getEntityIndex< 0, -1, 0 >(); - const IndexType b = neighbors.template getEntityIndex< 0, 0, -1 >(); - if( c * input[ e ] <= 0 ) - { - output[ cell.getIndex() ] = c; - output[ e ] = input[ e ]; - interfaceMap[ e ] = true; - interfaceMap[ cell.getIndex() ] = true; - } - else if( c * input[ n ] <= 0 ) - { - output[ cell.getIndex() ] = c; - output[ n ] = input[ n ]; - interfaceMap[ n ] = true; - interfaceMap[ cell.getIndex() ] = true; - } - else if( c * input[ t ] <= 0 ) - { - output[ cell.getIndex() ] = c; - output[ t ] = input[ t ]; - interfaceMap[ t ] = true; - interfaceMap[ cell.getIndex() ] = true; - }*/ - if( c * input[ n ] <= 0 ) - { - if( c >= 0 ) - { - pom = ( hy * c )/( c - input[ n ]); - if( output[ cell.getIndex() ] > pom ) - output[ cell.getIndex() ] = pom; - - if ( output[ n ] < pom - hy) - output[ n ] = pom - hy; // ( 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 = ( hx * c )/( c - input[ e ]); - if( output[ cell.getIndex() ] > pom ) - output[ cell.getIndex() ] = pom; - - pom = pom - hx; //output[ e ] = (hx * c)/( c - input[ e ]) - hx; - if( output[ e ] < 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; - } - if( c * input[ t ] <= 0 ) - { - if( c >= 0 ) - { - pom = ( hz * c )/( c - input[ t ]); - if( output[ cell.getIndex() ] > pom ) - output[ cell.getIndex() ] = pom; - - pom = pom - hz; //output[ e ] = (hx * c)/( c - input[ e ]) - hx; - if( output[ t ] < pom ) - output[ t ] = pom; - - }else - { - pom = - (hz * c)/( c - input[ t ]); - if( output[ cell.getIndex() ] < pom ) - output[ cell.getIndex() ] = pom; - - pom = pom + hz; //output[ e ] = hx - (hx * c)/( c - input[ e ]); - if( output[ t ] > pom ) - output[ t ] = pom; - - } - interfaceMap[ cell.getIndex() ] = true; - interfaceMap[ t ] = true; - } - } - /*output[ cell.getIndex() ] = - c > 0 ? TypeInfo< RealType >::getMaxValue() : - -TypeInfo< RealType >::getMaxValue(); - interfaceMap[ cell.getIndex() ] = false;*/ //is on line 245 + pom = ( hy * c )/( c - input[ n ]); + if( output[ cell.getIndex() ] > pom ) + output[ cell.getIndex() ] = pom; + + if ( output[ n ] < pom - hy) + output[ n ] = pom - hy; // ( 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 = ( hx * c )/( c - input[ e ]); + if( output[ cell.getIndex() ] > pom ) + output[ cell.getIndex() ] = pom; + + pom = pom - hx; //output[ e ] = (hx * c)/( c - input[ e ]) - hx; + if( output[ e ] < 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; + } + if( c * input[ t ] <= 0 ) + { + if( c >= 0 ) + { + pom = ( hz * c )/( c - input[ t ]); + if( output[ cell.getIndex() ] > pom ) + output[ cell.getIndex() ] = pom; + + pom = pom - hz; //output[ e ] = (hx * c)/( c - input[ e ]) - hx; + if( output[ t ] < pom ) + output[ t ] = pom; + + }else + { + pom = - (hz * c)/( c - input[ t ]); + if( output[ cell.getIndex() ] < pom ) + output[ cell.getIndex() ] = pom; + + pom = pom + hz; //output[ e ] = hx - (hx * c)/( c - input[ e ]); + if( output[ t ] > pom ) + output[ t ] = pom; + + } + interfaceMap[ cell.getIndex() ] = true; + interfaceMap[ t ] = true; + } + } + /*output[ cell.getIndex() ] = + c > 0 ? TypeInfo< RealType >::getMaxValue() : + -TypeInfo< RealType >::getMaxValue(); + interfaceMap[ cell.getIndex() ] = false;*/ //is on line 245 + } + } } template< typename Real, - typename Device, - typename Index > - template< typename MeshEntity > + typename Device, + typename Index > +template< typename MeshEntity > __cuda_callable__ void tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >:: updateCell( MeshFunctionType& u, - const MeshEntity& cell, - const RealType v ) + const MeshEntity& cell, + const RealType v ) { - const auto& neighborEntities = cell.template getNeighborEntities< 3 >(); - const MeshType& mesh = cell.getMesh(); + 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 + 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; + + + /*if( fabs( a ) != TypeInfo< Real >::getMaxValue() && + fabs( b ) != TypeInfo< Real >::getMaxValue() && + fabs( a - b ) >= TNL::sqrt( (hx * hx + hy * hy)/v ) ) { - a = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< -1, 0, 0 >() ], - u[ neighborEntities.template getEntityIndex< 1, 0, 0 >() ] ); + tmp = ( hx * hx * a + hy * hy * b + + sign( value ) * hx * hy * sqrt( ( hx * hx + hy * hy )/v - + ( a - b ) * ( a - b ) ) )/( hx * hx + hy * hy ); } - 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 + if( fabs( a ) != TypeInfo< Real >::getMaxValue() && + fabs( c ) != TypeInfo< Real >::getMaxValue() && + fabs( a - c ) >= TNL::sqrt( (hx * hx + hz * hz)/v ) ) { - c = TNL::argAbsMin( u[ neighborEntities.template getEntityIndex< 0, 0, -1 >() ], - u[ neighborEntities.template getEntityIndex< 0, 0, 1 >() ] ); + tmp = ( hx * hx * a + hz * hz * c + + sign( value ) * hx * hz * sqrt( ( hx * hx + hz * hz )/v - + ( a - c ) * ( a - c ) ) )/( hx * hx + hz * hz ); } - if( fabs( a ) == std::numeric_limits< RealType >::max() && - fabs( b ) == std::numeric_limits< RealType >::max() && - fabs( c ) == std::numeric_limits< RealType >::max() ) - return; - - - /*if( fabs( a ) != TypeInfo< Real >::getMaxValue() && - fabs( b ) != TypeInfo< Real >::getMaxValue() && - fabs( a - b ) >= TNL::sqrt( (hx * hx + hy * hy)/v ) ) - { - tmp = ( hx * hx * a + hy * hy * b + - sign( value ) * hx * hy * sqrt( ( hx * hx + hy * hy )/v - - ( a - b ) * ( a - b ) ) )/( hx * hx + hy * hy ); - } - if( fabs( a ) != TypeInfo< Real >::getMaxValue() && - fabs( c ) != TypeInfo< Real >::getMaxValue() && - fabs( a - c ) >= TNL::sqrt( (hx * hx + hz * hz)/v ) ) - { - tmp = ( hx * hx * a + hz * hz * c + - sign( value ) * hx * hz * sqrt( ( hx * hx + hz * hz )/v - - ( a - c ) * ( a - c ) ) )/( hx * hx + hz * hz ); - } - if( fabs( b ) != TypeInfo< Real >::getMaxValue() && - fabs( c ) != TypeInfo< Real >::getMaxValue() && - fabs( b - c ) >= TNL::sqrt( (hy * hy + hz * hz)/v ) ) - { - tmp = ( hy * hy * b + hz * hz * c + - sign( value ) * hy * hz * sqrt( ( hy * hy + hz * hz )/v - - ( b - c ) * ( b - c ) ) )/( hy * hy + hz * hz ); - }*/ - 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 ] ) ) + if( fabs( b ) != TypeInfo< Real >::getMaxValue() && + fabs( c ) != TypeInfo< Real >::getMaxValue() && + fabs( b - c ) >= TNL::sqrt( (hy * hy + hz * hz)/v ) ) + { + tmp = ( hy * hy * b + hz * hz * c + + sign( value ) * hy * hz * sqrt( ( hy * hy + hz * hz )/v - + ( b - c ) * ( b - c ) ) )/( hy * hy + hz * hz ); + }*/ + 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 ); + } + 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 ); + u[ cell.getIndex() ] = argAbsMin( value, tmp ); } 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 ); - } - 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 = ( 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 ); } + } } template < typename T1, typename T2 > T1 meet2DCondition( T1 a, T1 b, const T2 ha, const T2 hb, const T1 value, double v) { - T1 tmp; - if( fabs( a ) != std::numeric_limits< T1 >::max && - fabs( b ) != std::numeric_limits< T1 >::max && - fabs( a - b ) < ha/v )//TNL::sqrt( (ha * ha + hb * hb)/2 )/v ) - { - tmp = ( ha * ha * b + hb * hb * a + + T1 tmp; + if( fabs( a ) != std::numeric_limits< T1 >::max && + fabs( b ) != std::numeric_limits< T1 >::max && + fabs( a - b ) < ha/v )//TNL::sqrt( (ha * ha + hb * hb)/2 )/v ) + { + tmp = ( ha * ha * b + hb * hb * a + TNL::sign( value ) * ha * hb * TNL::sqrt( ( ha * ha + hb * hb )/( v * v ) - ( a - b ) * ( a - b ) ) )/( ha * ha + hb * hb ); - } - else - { - tmp = std::numeric_limits< T1 >::max; - } - - return tmp; + } + else + { + tmp = std::numeric_limits< T1 >::max; + } + + return tmp; } 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]; - } + 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]; - for( int i = 0; i < 6; i++ ) - { - pom[ i ] = tmp[ i ]; - } + } + 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( 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 ) == 10&& //std::numeric_limits< RealType >::max() && + fabs( b ) == 10&&//std::numeric_limits< RealType >::max() && + fabs( c ) == 10)//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 ) + 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 >(); + 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(); + - if( i < mesh.getDimensions().x() ) + 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() ) { - 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; - } - } + 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 ) + Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& output, + Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap ) { - 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 >(); + 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(); + - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() ) + output[ cind ] = + input( cell ) >= 0 ? std::numeric_limits< Real >::max() : + - std::numeric_limits< Real >::max(); + interfaceMap[ cind ] = false; + + const Real& hx = mesh.getSpaceSteps().x(); + const Real& hy = mesh.getSpaceSteps().y(); + cell.refresh(); + const Real& c = input( cell ); + if( ! cell.isBoundaryEntity() ) { - 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; - - 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; - } - } + 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 ) + Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& output, + Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap ) { - 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 >(); + 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() && j < mesh.getDimensions().y() && k < mesh.getDimensions().z() ) + 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() ) { - 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(); - - 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; - } - } + 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< 2, Real, Device, Index > >:: -updateCell( volatile Real sArray[18][18], int thri, int thrj, const Real hx, const Real hy, - const Real v ) -{ - const RealType value = sArray[ thrj ][ thri ]; - RealType a, b, tmp = std::numeric_limits< RealType >::max(); - - b = TNL::argAbsMin( sArray[ thrj+1 ][ thri ], - sArray[ thrj-1 ][ thri ] ); - - a = TNL::argAbsMin( sArray[ thrj ][ thri+1 ], - sArray[ thrj ][ 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 ][ thri ] = argAbsMin( value, tmp ); - tmp = value - sArray[ thrj ][ thri ]; - if ( fabs( tmp ) > 0.01*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 ][ thri ] = argAbsMin( value, tmp ); - tmp = value - sArray[ thrj ][ thri ]; - if ( fabs( tmp ) > 0.01*hx ) - return true; - else - return false; - } - - return false; -} template< typename Real, - typename Device, - typename Index > + 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.01*h ) - return true; - else - return false; -} - -template< typename Real, - typename Device, - typename Index > -__cuda_callable__ -bool -tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > >:: -updateCell( volatile Real sArray[10][10][10], int thri, int thrj, int thrk, - const Real hx, const Real hy, const Real hz, const Real v ) -{ - const RealType value = sArray[thrk][thrj][thri]; - //std::cout << value << std::endl; - RealType a, b, c, tmp = std::numeric_limits< RealType >::max(); - - c = TNL::argAbsMin( sArray[ thrk+1 ][ thrj ][ thri ], - sArray[ thrk-1 ][ thrj ][ thri ] ); - - b = TNL::argAbsMin( sArray[ thrk ][ thrj+1 ][ thri ], - sArray[ thrk ][ thrj-1 ][ thri ] ); - - a = TNL::argAbsMin( sArray[ thrk ][ thrj ][ thri+1 ], - sArray[ thrk ][ thrj ][ thri-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 ] ) ) - { - sArray[ thrk ][ thrj ][ thri ] = argAbsMin( value, tmp ); - tmp = value - sArray[ thrk ][ thrj ][ thri ]; - if ( fabs( tmp ) > 0.01*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 ][ thrj ][ thri ] = argAbsMin( value, tmp ); - tmp = value - sArray[ thrk ][ thrj ][ thri ]; - if ( fabs( tmp ) > 0.01*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 ][ thrj ][ thri ] = argAbsMin( value, tmp ); - tmp = value - sArray[ thrk ][ thrj ][ thri ]; - if ( fabs( tmp ) > 0.01*hx ) - return true; - else - return false; - } - } - + 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 diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h index fa807742735f8beaa034b9a2555d3bc4a57f9f8e..57b1886e8b67c943051623c0a07f301faa76cad8 100644 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h +++ b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod.h @@ -1,9 +1,9 @@ /*************************************************************************** - FastSweepingMethod.h - description - ------------------- - begin : Jul 14, 2016 - copyright : (C) 2017 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz + FastSweepingMethod.h - description + ------------------- + begin : Jul 14, 2016 + copyright : (C) 2017 by Tomas Oberhuber + email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ /* See Copyright Notice in tnl/Copyright */ @@ -17,131 +17,134 @@ template< typename Mesh, - typename Anisotropy = Functions::Analytic::Constant< Mesh::getMeshDimension(), typename Mesh::RealType > > + typename Anisotropy = Functions::Analytic::Constant< Mesh::getMeshDimension(), typename Mesh::RealType > > class FastSweepingMethod { }; template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > class FastSweepingMethod< Meshes::Grid< 1, Real, Device, Index >, Anisotropy > - : public tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > +: public tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > { - //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); - - public: - - typedef Meshes::Grid< 1, Real, Device, Index > MeshType; - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef Anisotropy AnisotropyType; - typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > BaseType; - using MeshPointer = Pointers::SharedPointer< MeshType >; - using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; - - - using typename BaseType::InterfaceMapType; - using typename BaseType::MeshFunctionType; - using typename BaseType::InterfaceMapPointer; - using typename BaseType::MeshFunctionPointer; - - - FastSweepingMethod(); - - const IndexType& getMaxIterations() const; - - void setMaxIterations( const IndexType& maxIterations ); - - void solve( const MeshPointer& mesh, - const AnisotropyPointer& anisotropy, - MeshFunctionPointer& u ); - - - protected: + //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); + + public: + + typedef Meshes::Grid< 1, Real, Device, Index > MeshType; + typedef Real RealType; + typedef Device DeviceType; + typedef Index IndexType; + typedef Anisotropy AnisotropyType; + typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 1, Real, Device, Index > > BaseType; + using MeshPointer = Pointers::SharedPointer< MeshType >; + using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; + + + using typename BaseType::InterfaceMapType; + using typename BaseType::MeshFunctionType; + using typename BaseType::InterfaceMapPointer; + using typename BaseType::MeshFunctionPointer; + + + FastSweepingMethod(); + + const IndexType& getMaxIterations() const; + + void setMaxIterations( const IndexType& maxIterations ); + + void solve( const MeshPointer& mesh, + const AnisotropyPointer& anisotropy, + MeshFunctionPointer& u ); + + + protected: const IndexType maxIterations; }; template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > class FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Anisotropy > - : public tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > +: public tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > { - //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); - - public: - - typedef Meshes::Grid< 2, Real, Device, Index > MeshType; - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef Anisotropy AnisotropyType; - typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > BaseType; - using MeshPointer = Pointers::SharedPointer< MeshType >; - using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; - - using typename BaseType::InterfaceMapType; - using typename BaseType::MeshFunctionType; - using typename BaseType::InterfaceMapPointer; - using typename BaseType::MeshFunctionPointer; - - FastSweepingMethod(); - - const IndexType& getMaxIterations() const; - - void setMaxIterations( const IndexType& maxIterations ); - - void solve( const MeshPointer& mesh, - const AnisotropyPointer& anisotropy, - MeshFunctionPointer& u ); - - protected: + //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); + + public: + + typedef Meshes::Grid< 2, Real, Device, Index > MeshType; + typedef Real RealType; + typedef Device DeviceType; + typedef Index IndexType; + typedef Anisotropy AnisotropyType; + typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > BaseType; + using MeshPointer = Pointers::SharedPointer< MeshType >; + using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; + + using typename BaseType::InterfaceMapType; + using typename BaseType::MeshFunctionType; + using typename BaseType::InterfaceMapPointer; + using typename BaseType::MeshFunctionPointer; + using typename BaseType::ArrayContainer; + + FastSweepingMethod(); + + const IndexType& getMaxIterations() const; + + void setMaxIterations( const IndexType& maxIterations ); + + void solve( const MeshPointer& mesh, + const AnisotropyPointer& anisotropy, + MeshFunctionPointer& u ); + + protected: const IndexType maxIterations; }; template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > class FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Anisotropy > - : public tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > +: public tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > { - //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); - - public: - - typedef Meshes::Grid< 3, Real, Device, Index > MeshType; - typedef Real RealType; - typedef Device DeviceType; - typedef Index IndexType; - typedef Anisotropy AnisotropyType; - typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > BaseType; - using MeshPointer = Pointers::SharedPointer< MeshType >; - using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; - - using typename BaseType::InterfaceMapType; - using typename BaseType::MeshFunctionType; - using typename BaseType::InterfaceMapPointer; - using typename BaseType::MeshFunctionPointer; - - FastSweepingMethod(); - - const IndexType& getMaxIterations() const; - - void setMaxIterations( const IndexType& maxIterations ); - - void solve( const MeshPointer& mesh, - const AnisotropyPointer& anisotropy, - MeshFunctionPointer& u ); - - - protected: + //static_assert( std::is_same< Device, TNL::Devices::Host >::value, "The fast sweeping method works only on CPU." ); + + public: + + typedef Meshes::Grid< 3, Real, Device, Index > MeshType; + typedef Real RealType; + typedef Device DeviceType; + typedef Index IndexType; + typedef Anisotropy AnisotropyType; + typedef tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > BaseType; + using MeshPointer = Pointers::SharedPointer< MeshType >; + using AnisotropyPointer = Pointers::SharedPointer< AnisotropyType, DeviceType >; + + using typename BaseType::InterfaceMapType; + using typename BaseType::MeshFunctionType; + using typename BaseType::InterfaceMapPointer; + using typename BaseType::MeshFunctionPointer; + using typename BaseType::ArrayContainer; + + + FastSweepingMethod(); + + const IndexType& getMaxIterations() const; + + void setMaxIterations( const IndexType& maxIterations ); + + void solve( const MeshPointer& mesh, + const AnisotropyPointer& anisotropy, + MeshFunctionPointer& u ); + + + protected: const IndexType maxIterations; }; diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h index 6703843c179ea0215c40cf2d21b9cd66fde99de6..d5ce1efe164bc835866dc7fc95909b3defdf846f 100644 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h +++ b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod2D_impl.h @@ -15,511 +15,733 @@ #include "tnlFastSweepingMethod.h" #include <TNL/Devices/Cuda.h> +#include <TNL/Communicators/MpiDefs.h> + + +#include <string.h> #include <iostream> #include <fstream> template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Anisotropy >:: FastSweepingMethod() -: maxIterations( 100 ) +: maxIterations( 1 ) { - + } template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > const Index& FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Anisotropy >:: getMaxIterations() const { - + } template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Anisotropy >:: setMaxIterations( const IndexType& maxIterations ) { - + } template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 2, Real, Device, Index >, Anisotropy >:: solve( const MeshPointer& mesh, - const AnisotropyPointer& anisotropy, - MeshFunctionPointer& u ) -{ - /*MeshFunctionType v; - v.setMesh(mesh); - double A[320][320]; - for (int i = 0; i < 320; i++) - for (int j = 0; j < 320; j++) - A[i][j] = 0; - - std::ifstream file("/home/maty/Downloads/mapa2.txt"); - - for (int i = 0; i < 320; i++) - for (int j = 0; j < 320; j++) - file >> A[i][j]; - file.close(); - for (int i = 0; i < 320; i++) - for (int j = 0; j < 320; j++) - v[i*320 + j] = A[i][j]; - v.save("mapa.tnl");*/ - - - MeshFunctionPointer auxPtr; - InterfaceMapPointer interfaceMapPtr; - auxPtr->setMesh( mesh ); - interfaceMapPtr->setMesh( mesh ); - std::cout << "Initiating the interface cells ..." << std::endl; - BaseType::initInterface( u, auxPtr, interfaceMapPtr ); + const AnisotropyPointer& anisotropy, + MeshFunctionPointer& u ) +{ + MeshFunctionPointer auxPtr; + InterfaceMapPointer interfaceMapPtr; + auxPtr->setMesh( mesh ); + interfaceMapPtr->setMesh( mesh ); + std::cout << "Initiating the interface cells ..." << std::endl; + BaseType::initInterface( u, auxPtr, interfaceMapPtr ); + + auxPtr->save( "aux-ini.tnl" ); + + typename MeshType::Cell cell( *mesh ); + + IndexType iteration( 0 ); + InterfaceMapType interfaceMap = *interfaceMapPtr; + MeshFunctionType aux = *auxPtr; + + +//#ifdef HAVE_MPI + bool a = Communicators::MpiCommunicator::IsInitialized(); + if( a ) + printf("Je Init\n"); + else + printf("Neni Init\n"); +//#endif + + while( iteration < this->maxIterations ) + { + if( std::is_same< DeviceType, Devices::Host >::value ) + { + int numThreadsPerBlock = -1; + + numThreadsPerBlock = ( mesh->getDimensions().x()/2 + (mesh->getDimensions().x() % 2 != 0 ? 1:0)); + //printf("numThreadsPerBlock = %d\n", numThreadsPerBlock); + if( numThreadsPerBlock <= 16 ) + numThreadsPerBlock = 16; + else if(numThreadsPerBlock <= 32 ) + numThreadsPerBlock = 32; + else if(numThreadsPerBlock <= 64 ) + numThreadsPerBlock = 64; + else if(numThreadsPerBlock <= 128 ) + numThreadsPerBlock = 128; + else if(numThreadsPerBlock <= 256 ) + numThreadsPerBlock = 256; + else if(numThreadsPerBlock <= 512 ) + numThreadsPerBlock = 512; + else + numThreadsPerBlock = 1024; + //printf("numThreadsPerBlock = %d\n", numThreadsPerBlock); + + if( numThreadsPerBlock == -1 ){ + printf("Fail in setting numThreadsPerBlock.\n"); + break; + } + + + + int numBlocksX = mesh->getDimensions().x() / numThreadsPerBlock + (mesh->getDimensions().x() % numThreadsPerBlock != 0 ? 1:0); + int numBlocksY = mesh->getDimensions().y() / numThreadsPerBlock + (mesh->getDimensions().y() % numThreadsPerBlock != 0 ? 1:0); + + //std::cout << "numBlocksX = " << numBlocksX << std::endl; + + /*Real **sArray = new Real*[numBlocksX*numBlocksY]; + for( int i = 0; i < numBlocksX * numBlocksY; i++ ) + sArray[ i ] = new Real [ (numThreadsPerBlock + 2)*(numThreadsPerBlock + 2)];*/ + + ArrayContainer BlockIterHost; + BlockIterHost.setSize( numBlocksX * numBlocksY ); + BlockIterHost.setValue( 1 ); + int IsCalculationDone = 1; + + MeshFunctionPointer helpFunc( mesh ); + MeshFunctionPointer helpFunc1( mesh ); + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + //std::cout<< "Size = " << BlockIterHost.getSize() << std::endl; + /*for( int k = numBlocksX-1; k >-1; k-- ){ + for( int l = 0; l < numBlocksY; l++ ){ + std::cout<< BlockIterHost[ l*numBlocksX + k ]; + } + std::cout<<std::endl; + } + std::cout<<std::endl;*/ + unsigned int numWhile = 0; + while( IsCalculationDone ) + { + IsCalculationDone = 0; + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + switch ( numThreadsPerBlock ){ + case 16: + this->template updateBlocks< 18 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + case 32: + this->template updateBlocks< 34 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + case 64: + this->template updateBlocks< 66 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + case 128: + this->template updateBlocks< 130 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + case 256: + this->template updateBlocks< 258 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + case 512: + this->template updateBlocks< 514 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + default: + this->template updateBlocks< 1028 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + } - auxPtr->save( "aux-ini.tnl" ); - - typename MeshType::Cell cell( *mesh ); - - IndexType iteration( 0 ); - InterfaceMapType interfaceMap = *interfaceMapPtr; - MeshFunctionType aux = *auxPtr; - while( iteration < this->maxIterations ) - { - if( std::is_same< DeviceType, Devices::Host >::value ) - { - 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(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - - //aux.save( "aux-1.tnl" ); - - for( cell.getCoordinates().y() = 0; - cell.getCoordinates().y() < mesh->getDimensions().y(); - cell.getCoordinates().y()++ ) - { - for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - //std::cerr << "2 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - - //aux.save( "aux-2.tnl" ); - - for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; - cell.getCoordinates().y() >= 0 ; - cell.getCoordinates().y()-- ) - { - for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh->getDimensions().x(); - cell.getCoordinates().x()++ ) - { - //std::cerr << "3 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - - //aux.save( "aux-3.tnl" ); - - for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; - cell.getCoordinates().y() >= 0; - cell.getCoordinates().y()-- ) - { - for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - //std::cerr << "4 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - - //aux.save( "aux-4.tnl" ); - - /*for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh->getDimensions().y(); - cell.getCoordinates().x()++ ) - { - for( cell.getCoordinates().y() = 0; - cell.getCoordinates().y() < mesh->getDimensions().x(); - cell.getCoordinates().y()++ ) - { - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - - - aux.save( "aux-5.tnl" ); - - for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh->getDimensions().y(); - cell.getCoordinates().x()++ ) - { - for( cell.getCoordinates().y() = mesh->getDimensions().x() - 1; - cell.getCoordinates().y() >= 0 ; - cell.getCoordinates().y()-- ) - { - //std::cerr << "2 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } + + //Reduction + for( int i = 0; i < BlockIterHost.getSize(); i++ ){ + if( IsCalculationDone == 0 ){ + IsCalculationDone = IsCalculationDone || BlockIterHost[ i ]; + //break; + } + } + numWhile++; + /*std::cout <<"numWhile = "<< numWhile <<std::endl; + + for( int j = numBlocksY-1; j>-1; j-- ){ + for( int i = 0; i < numBlocksX; i++ ) + std::cout << BlockIterHost[ j * numBlocksX + i ]; + std::cout << std::endl; + } + std::cout << std::endl;*/ + + this->getNeighbours( BlockIterHost, numBlocksX, numBlocksY ); + + /*for( int j = numBlocksY-1; j>-1; j-- ){ + for( int i = 0; i < numBlocksX; i++ ) + std::cout << "BlockIterHost = "<< j*numBlocksX + i<< " ," << BlockIterHost[ j * numBlocksX + i ]; + std::cout << std::endl; } - aux.save( "aux-6.tnl" ); - - for( cell.getCoordinates().x() = mesh->getDimensions().y() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - for( cell.getCoordinates().y() = 0; - cell.getCoordinates().y() < mesh->getDimensions().x(); - cell.getCoordinates().y()++ ) - { - //std::cerr << "3 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - aux.save( "aux-7.tnl" ); - - for( cell.getCoordinates().x() = mesh->getDimensions().y() - 1; - cell.getCoordinates().x() >= 0; - cell.getCoordinates().x()-- ) - { - for( cell.getCoordinates().y() = mesh->getDimensions().x() - 1; - cell.getCoordinates().y() >= 0 ; - cell.getCoordinates().y()-- ) - { - //std::cerr << "4 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - }*/ + std::cout << std::endl;*/ + + //std::cout<<std::endl; + //string s( "aux-"+ std::to_string(numWhile) + ".tnl"); + //aux.save( s ); } - if( std::is_same< DeviceType, Devices::Cuda >::value ) - { - // TODO: CUDA code + if( numWhile == 1 ){ + auxPtr = helpFunc; + } + /*for( int i = 0; i < numBlocksX * numBlocksY; i++ ) + delete []sArray[i];*/ + + + /*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(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + + //aux.save( "aux-1.tnl" ); + + for( cell.getCoordinates().y() = 0; + cell.getCoordinates().y() < mesh->getDimensions().y(); + cell.getCoordinates().y()++ ) + { + for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; + cell.getCoordinates().x() >= 0 ; + cell.getCoordinates().x()-- ) + { + //std::cerr << "2 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + + //aux.save( "aux-2.tnl" ); + + for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; + cell.getCoordinates().y() >= 0 ; + cell.getCoordinates().y()-- ) + { + for( cell.getCoordinates().x() = 0; + cell.getCoordinates().x() < mesh->getDimensions().x(); + cell.getCoordinates().x()++ ) + { + //std::cerr << "3 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + + //aux.save( "aux-3.tnl" ); + + for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; + cell.getCoordinates().y() >= 0; + cell.getCoordinates().y()-- ) + { + for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; + cell.getCoordinates().x() >= 0 ; + cell.getCoordinates().x()-- ) + { + //std::cerr << "4 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + + for( int j = 0; + j < mesh->getDimensions().y(); + j++ ) + { + for( int i = 0; + i < mesh->getDimensions().x(); + i++ ) + { + std::cout << aux[ i * mesh->getDimensions().y() + j ] << " "; + } + std::cout << std::endl; + }*/ + + } + if( std::is_same< DeviceType, Devices::Cuda >::value ) + { + // TODO: CUDA code #ifdef HAVE_CUDA - - Real *dAux; - cudaMalloc(&dAux, ( mesh->getDimensions().x() * mesh->getDimensions().y() ) * sizeof( Real ) ); - - - - - 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 ); - - tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > ptr; - - aux1<<< gridSize, blockSize >>>( auxPtr.template modifyData< Device>(), dAux,1 ); - - //int BlockIter = 1;// = (bool*)malloc( ( numBlocksX * numBlocksY ) * sizeof( bool ) ); - - int *BlockIterDevice; - int BlockIterD = 1; - - cudaMalloc(&BlockIterDevice, ( numBlocksX * numBlocksY ) * sizeof( int ) ); - int nBlocks = ( numBlocksX * numBlocksY )/512 + ((( numBlocksX * numBlocksY )%512 != 0) ? 1:0); - int *dBlock; - cudaMalloc(&dBlock, nBlocks * sizeof( int ) ); - - while( BlockIterD ) - { - /*for( int i = 0; i < numBlocksX * numBlocksY; i++ ) - BlockIter[ i ] = false;*/ - - CudaUpdateCellCaller<<< gridSize, blockSize >>>( ptr, - interfaceMapPtr.template getData< Device >(), - dAux, - BlockIterDevice ); - - CudaParallelReduc<<< nBlocks , 512 >>>( BlockIterDevice, dBlock, ( numBlocksX * numBlocksY ) ); - CudaParallelReduc<<< 1, nBlocks >>>( dBlock, dBlock, nBlocks ); - - cudaMemcpy(&BlockIterD, &dBlock[0], sizeof( int ), cudaMemcpyDeviceToHost); - - /*for( int i = 1; i < numBlocksX * numBlocksY; i++ ) - BlockIter[ 0 ] = BlockIter[ 0 ] || BlockIter[ i ];*/ - - } - aux1<<<gridSize,blockSize>>>( auxPtr.template modifyData< Device>(), dAux, 0 ); - cudaFree( dAux ); - cudaFree( BlockIterDevice ); - cudaFree( dBlock ); - cudaDeviceSynchronize(); - - TNL_CHECK_CUDA_DEVICE; - - //aux = *auxPtr; - //interfaceMap = *interfaceMapPtr; -#endif + TNL_CHECK_CUDA_DEVICE; + // Maximum cudaBlockSite is 32. Because of maximum num. of threads in kernel. + 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 ); + + tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > ptr; + + int BlockIterD = 1; + + TNL::Containers::Array< int, Devices::Cuda, IndexType > BlockIterDevice; + BlockIterDevice.setSize( numBlocksX * numBlocksY ); + BlockIterDevice.setValue( 1 ); + TNL_CHECK_CUDA_DEVICE; + + + TNL::Containers::Array< int, Devices::Cuda, IndexType > BlockIterPom; + BlockIterPom.setSize( numBlocksX * numBlocksY ); + BlockIterPom.setValue( 0 ); + /*TNL::Containers::Array< int, Devices::Host, IndexType > BlockIterPom1; + BlockIterPom1.setSize( numBlocksX * numBlocksY ); + BlockIterPom1.setValue( 0 );*/ + /*int *BlockIterDevice; + cudaMalloc((void**) &BlockIterDevice, ( numBlocksX * numBlocksY ) * sizeof( int ) );*/ + int nBlocksNeigh = ( numBlocksX * numBlocksY )/1024 + ((( numBlocksX * numBlocksY )%1024 != 0) ? 1:0); + //std::cout << "nBlocksNeigh = " << nBlocksNeigh << std::endl; + //free( BlockIter ); + /*int *BlockIterPom; + cudaMalloc((void**) &BlockIterPom, ( numBlocksX * numBlocksY ) * sizeof( int ) );*/ + + int nBlocks = ( numBlocksX * numBlocksY )/1024 + ((( numBlocksX * numBlocksY )%1024 != 0) ? 1:0); + + TNL::Containers::Array< int, Devices::Cuda, IndexType > dBlock; + dBlock.setSize( nBlocks ); + TNL_CHECK_CUDA_DEVICE; + /*int *dBlock; + cudaMalloc((void**) &dBlock, nBlocks * sizeof( int ) );*/ + + + MeshFunctionPointer helpFunc1( mesh ); + MeshFunctionPointer helpFunc( mesh ); + + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + + int numIter = 0; + + //int oddEvenBlock = 0; + while( BlockIterD ) + { + /** HERE IS CHESS METHOD **/ + + /*auxPtr = helpFunc; + + CudaUpdateCellCaller<18><<< gridSize, blockSize >>>( ptr, + interfaceMapPtr.template getData< Device >(), + auxPtr.template getData< Device>(), + helpFunc.template modifyData< Device>(), + BlockIterDevice, + oddEvenBlock ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + auxPtr = helpFunc; + + oddEvenBlock= (oddEvenBlock == 0) ? 1: 0; + + CudaUpdateCellCaller<18><<< gridSize, blockSize >>>( ptr, + interfaceMapPtr.template getData< Device >(), + auxPtr.template getData< Device>(), + helpFunc.template modifyData< Device>(), + BlockIterDevice, + oddEvenBlock ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + auxPtr = helpFunc; + + oddEvenBlock= (oddEvenBlock == 0) ? 1: 0; + + CudaParallelReduc<<< nBlocks , 1024 >>>( BlockIterDevice, dBlock, ( numBlocksX * numBlocksY ) ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + CudaParallelReduc<<< 1, nBlocks >>>( dBlock, dBlock, nBlocks ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + + BlockIterD = dBlock.getElement( 0 );*/ + + /**------------------------------------------------------------------------------------------------*/ + + + /** HERE IS FIM **/ + + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + TNL_CHECK_CUDA_DEVICE; + + //int pocBloku = 0; + Devices::Cuda::synchronizeDevice(); + CudaUpdateCellCaller<18><<< gridSize, blockSize >>>( ptr, + interfaceMapPtr.template getData< Device >(), + auxPtr.template modifyData< Device>(), + helpFunc.template modifyData< Device>(), + BlockIterDevice ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + + //std::cout << "Pocet aktivnich bloku = " << pocBloku << std::endl; + //BlockIterPom1 = BlockIterDevice; + ///for( int i =0; i< numBlocksX; i++ ){ + // for( int j = 0; j < numBlocksY; j++ ) + // { + // std::cout << BlockIterPom1[j*numBlocksX + i]; + // } + // std::cout << std::endl; + //} + //std::cout << std::endl; + + GetNeighbours<<< nBlocksNeigh, 1024 >>>( BlockIterDevice, BlockIterPom, numBlocksX, numBlocksY ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + BlockIterDevice = BlockIterPom; + + //std::cout<< "Probehlo" << std::endl; + + //TNL::swap( auxPtr, helpFunc ); + + + CudaParallelReduc<<< nBlocks , 1024 >>>( BlockIterDevice, dBlock, ( numBlocksX * numBlocksY ) ); + TNL_CHECK_CUDA_DEVICE; + + CudaParallelReduc<<< 1, nBlocks >>>( dBlock, dBlock, nBlocks ); + TNL_CHECK_CUDA_DEVICE; + + + BlockIterD = dBlock.getElement( 0 ); + //cudaMemcpy( &BlockIterD, &dBlock[0], sizeof( int ), cudaMemcpyDeviceToHost); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + + + /**-----------------------------------------------------------------------------------------------------------*/ + /*for( int i = 1; i < numBlocksX * numBlocksY; i++ ) + BlockIter[ 0 ] = BlockIter[ 0 ] || BlockIter[ i ];*/ + numIter ++; } - iteration++; - } - aux.save("aux-final.tnl"); + if( numIter == 1 ){ + auxPtr = helpFunc; + } + /*cudaFree( BlockIterDevice ); + cudaFree( dBlock ); + delete BlockIter;*/ + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + + aux = *auxPtr; + interfaceMap = *interfaceMapPtr; +#endif + } + iteration++; + } + //#endif + aux.save("aux-final.tnl"); } + #ifdef HAVE_CUDA -template < typename Real, typename Device, typename Index > -__global__ void aux1( Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& aux, Real *dAux, int a ) + + +template < typename Index > +__global__ void GetNeighbours( TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterPom, int numBlockX, int numBlockY ) { - int i = threadIdx.x + blockDim.x*blockIdx.x; - int j = blockDim.y*blockIdx.y + threadIdx.y; - const Meshes::Grid< 2, Real, Device, Index >& mesh = aux.template getMesh< Devices::Cuda >(); - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && a == 1 ) - { - dAux[ j*mesh.getDimensions().x() + i ] = aux[ j*mesh.getDimensions().x() + i ]; - } - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && a == 0 ) - { - aux[ j*mesh.getDimensions().x() + i ] = dAux[ j*mesh.getDimensions().x() + i ]; + int i = blockIdx.x * 1024 + threadIdx.x; + + if( i < numBlockX * numBlockY ) + { + int pom = 0;//BlockIterPom[ i ] = 0; + int m=0, k=0; + m = i%numBlockX; + k = i/numBlockX; + if( m > 0 && BlockIterDevice[ i - 1 ] ){ + pom = 1;//BlockIterPom[ i ] = 1; + }else if( m < numBlockX -1 && BlockIterDevice[ i + 1 ] ){ + pom = 1;//BlockIterPom[ i ] = 1; + }else if( k > 0 && BlockIterDevice[ i - numBlockX ] ){ + pom = 1;// BlockIterPom[ i ] = 1; + }else if( k < numBlockY -1 && BlockIterDevice[ i + numBlockX ] ){ + pom = 1;//BlockIterPom[ i ] = 1; } + BlockIterPom[ i ] = pom;//BlockIterPom[ i ]; + } } -__global__ void CudaParallelReduc( int *BlockIterDevice, int *dBlock, int nBlocks ) +template < typename Index > +__global__ void CudaParallelReduc( TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, + TNL::Containers::Array< int, Devices::Cuda, Index > dBlock, int nBlocks ) { - int i = threadIdx.x; - int blId = blockIdx.x; - __shared__ volatile int sArray[ 512 ]; - sArray[ i ] = false; - if(blId * 1024 + i < nBlocks ) - sArray[ i ] = BlockIterDevice[ blId * 1024 + i ]; - - if (blockDim.x * blockDim.y == 1024) { - if (i < 512) - sArray[ i ] += sArray[ i ]; - } - __syncthreads(); - if (blockDim.x * blockDim.y >= 512) { - if (i < 256) { - sArray[ i ] += sArray[ i ]; - } - } - if (blockDim.x * blockDim.y >= 256) { - if (i < 128) { - sArray[ i ] += sArray[ i + 128 ]; - } + int i = threadIdx.x; + int blId = blockIdx.x; + int blockSize = blockDim.x; + /*if ( i == 0 && blId == 0 ){ + printf( "nBlocks = %d \n", nBlocks ); + for( int j = nBlocks-1; j > -1 ; j--){ + printf( "cislo = %d \n", BlockIterDevice[ j ] ); + } + }*/ + __shared__ int sArray[ 1024 ]; + sArray[ i ] = 0; + if( blId * 1024 + i < nBlocks ) + sArray[ i ] = BlockIterDevice[ blId * 1024 + i ]; + __syncthreads(); + /*extern __shared__ volatile int sArray[]; + unsigned int i = threadIdx.x; + unsigned int gid = blockIdx.x * blockSize * 2 + threadIdx.x; + unsigned int gridSize = blockSize * 2 * gridDim.x; + sArray[ i ] = 0; + while( gid < nBlocks ) + { + sArray[ i ] += BlockIterDevice[ gid ] + BlockIterDevice[ gid + blockSize ]; + gid += gridSize; + } + __syncthreads();*/ + + if ( blockSize == 1024) { + if (i < 512) + sArray[ i ] += sArray[ i + 512 ]; + } + __syncthreads(); + if (blockSize >= 512) { + if (i < 256) { + sArray[ i ] += sArray[ i + 256 ]; } - __syncthreads(); - if (blockDim.x * blockDim.y >= 128) { - if (i < 64) { - sArray[ i ] += sArray[ i + 64 ]; - } + } + __syncthreads(); + if (blockSize >= 256) { + if (i < 128) { + sArray[ i ] += sArray[ i + 128 ]; } - __syncthreads(); - if (i < 32 ) - { - if( blockDim.x * blockDim.y >= 64 ) sArray[ i ] += sArray[ i + 32 ]; - if( blockDim.x * blockDim.y >= 32 ) sArray[ i ] += sArray[ i + 16 ]; - if( blockDim.x * blockDim.y >= 16 ) sArray[ i ] += sArray[ i + 8 ]; - if( blockDim.x * blockDim.y >= 8 ) sArray[ i ] += sArray[ i + 4 ]; - if( blockDim.x * blockDim.y >= 4 ) sArray[ i ] += sArray[ i + 2 ]; - if( blockDim.x * blockDim.y >= 2 ) sArray[ i ] += sArray[ i + 1 ]; + } + __syncthreads(); + if (blockSize >= 128) { + if (i < 64) { + sArray[ i ] += sArray[ i + 64 ]; } - - if( i == 0 ) - dBlock[ blId ] = sArray[ 0 ]; + } + __syncthreads(); + if (i < 32 ) + { + if( blockSize >= 64 ) sArray[ i ] += sArray[ i + 32 ]; + if( blockSize >= 32 ) sArray[ i ] += sArray[ i + 16 ]; + if( blockSize >= 16 ) sArray[ i ] += sArray[ i + 8 ]; + if( blockSize >= 8 ) sArray[ i ] += sArray[ i + 4 ]; + if( blockSize >= 4 ) sArray[ i ] += sArray[ i + 2 ]; + if( blockSize >= 2 ) sArray[ i ] += sArray[ i + 1 ]; + } + + if( i == 0 ) + dBlock[ blId ] = sArray[ 0 ]; } -template < typename Real, typename Device, typename Index > +template < int sizeSArray, typename Real, typename Device, typename Index > __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< 2, Real, Device, Index > > ptr, - const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap, - Real *aux, - int *BlockIterDevice ) + const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index >, 2, bool >& interfaceMap, + const Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& aux, + Functions::MeshFunction< Meshes::Grid< 2, Real, Device, Index > >& helpFunc, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, int oddEvenBlock ) { - int thri = threadIdx.x; int thrj = threadIdx.y; - int blIdx = blockIdx.x; int blIdy = blockIdx.y; - int i = thri + blockDim.x*blIdx; - int j = blockDim.y*blIdy + thrj; - int currentIndex = thrj * blockDim.x + thri; - - //__shared__ volatile bool changed[ blockDim.x*blockDim.y ]; - __shared__ volatile bool changed[16*16]; - changed[ currentIndex ] = false; - - if( thrj == 0 && thri == 0 ) - changed[ 0 ] = true; - + int thri = threadIdx.x; int thrj = threadIdx.y; + int i = threadIdx.x + blockDim.x*blockIdx.x; + int j = blockDim.y*blockIdx.y + threadIdx.y; + /** FOR CHESS METHOD */ + //if( (blockIdx.y%2 + blockIdx.x) % 2 == oddEvenBlock ) + //{ + /**------------------------------------------*/ + + + /** FOR FIM METHOD */ + + if( BlockIterDevice[ blockIdx.y * gridDim.x + blockIdx.x ] ) + { + __syncthreads(); + /**-----------------------------------------*/ const Meshes::Grid< 2, Real, Device, Index >& mesh = interfaceMap.template getMesh< Devices::Cuda >(); + __shared__ int dimX; + __shared__ int dimY; __shared__ Real hx; __shared__ Real hy; - if( thrj == 1 && thri == 1 ) + if( thri==0 && thrj == 0) { - hx = mesh.getSpaceSteps().x(); - hy = mesh.getSpaceSteps().y(); + dimX = mesh.getDimensions().x(); + dimY = mesh.getDimensions().y(); + hx = mesh.getSpaceSteps().x(); + hy = mesh.getSpaceSteps().y(); + BlockIterDevice[ blockIdx.y * gridDim.x + blockIdx.x ] = 0; } + __syncthreads(); + int numOfBlockx; + int numOfBlocky; + int xkolik; + int ykolik; - //__shared__ volatile Real sArray[ blockDim.y+2 ][ blockDim.x+2 ]; - __shared__ volatile Real sArray[18][18]; - sArray[thrj][thri] = std::numeric_limits< Real >::max(); + xkolik = blockDim.x + 1; + ykolik = blockDim.y + 1; + numOfBlocky = dimY/blockDim.y + ((dimY%blockDim.y != 0) ? 1:0); + numOfBlockx = dimX/blockDim.x + ((dimX%blockDim.x != 0) ? 1:0); - //filling sArray edges - int dimX = mesh.getDimensions().x(); int dimY = mesh.getDimensions().y(); - __shared__ volatile int numOfBlockx; - __shared__ volatile int numOfBlocky; - __shared__ int xkolik; - __shared__ int ykolik; - if( thri == 0 && thrj == 0 ) - { - xkolik = blockDim.x + 1; - ykolik = blockDim.y + 1; - numOfBlocky = dimY/blockDim.y + ((dimY%blockDim.y != 0) ? 1:0); - numOfBlockx = dimX/blockDim.x + ((dimX%blockDim.x != 0) ? 1:0); + if( numOfBlockx - 1 == blockIdx.x ) + xkolik = dimX - (blockIdx.x)*blockDim.x+1; - if( numOfBlockx - 1 == blIdx ) - xkolik = dimX - (blIdx)*blockDim.x+1; - - if( numOfBlocky -1 == blIdy ) - ykolik = dimY - (blIdy)*blockDim.y+1; - BlockIterDevice[ blIdy * numOfBlockx + blIdx ] = 0; - } + if( numOfBlocky -1 == blockIdx.y ) + ykolik = dimY - (blockIdx.y)*blockDim.y+1; __syncthreads(); + int currentIndex = thrj * blockDim.x + thri; + //__shared__ volatile bool changed[ blockDim.x*blockDim.y ]; + __shared__ volatile bool changed[ (sizeSArray-2)*(sizeSArray-2)]; + changed[ currentIndex ] = false; + if( thrj == 0 && thri == 0 ) + changed[ 0 ] = true; + + + //__shared__ volatile Real sArray[ blockDim.y+2 ][ blockDim.x+2 ]; + __shared__ volatile Real sArray[ sizeSArray * sizeSArray ]; + sArray[ thrj * sizeSArray + thri ] = std::numeric_limits< Real >::max(); + + //filling sArray edges if( thri == 0 ) - { - if( dimX > (blIdx+1) * blockDim.x && thrj+1 < ykolik ) - sArray[thrj+1][xkolik] = aux[ blIdy*blockDim.y*dimX - dimX + blIdx*blockDim.x - 1 + (thrj+1)*dimX + xkolik ]; - else - sArray[thrj+1][xkolik] = std::numeric_limits< Real >::max(); + { + if( dimX > (blockIdx.x+1) * blockDim.x && thrj+1 < ykolik ) + sArray[(thrj+1)*sizeSArray + xkolik] = aux[ blockIdx.y*blockDim.y*dimX - dimX + blockIdx.x*blockDim.x - 1 + (thrj+1)*dimX + xkolik ]; + else + sArray[(thrj+1)*sizeSArray + xkolik] = std::numeric_limits< Real >::max(); } if( thri == 1 ) { - if( blIdx != 0 && thrj+1 < ykolik ) - sArray[thrj+1][0] = aux[ blIdy*blockDim.y*dimX - dimX + blIdx*blockDim.x - 1 + (thrj+1)*dimX ]; - else - sArray[thrj+1][0] = std::numeric_limits< Real >::max(); + if( blockIdx.x != 0 && thrj+1 < ykolik ) + sArray[(thrj+1)*sizeSArray + 0] = aux[ blockIdx.y*blockDim.y*dimX - dimX + blockIdx.x*blockDim.x - 1 + (thrj+1)*dimX ]; + else + sArray[(thrj+1)*sizeSArray + 0] = std::numeric_limits< Real >::max(); } if( thri == 2 ) { - if( dimY > (blIdy+1) * blockDim.y && thri+1 < xkolik ) - sArray[ykolik][thrj+1] = aux[ blIdy*blockDim.y*dimX - dimX + blIdx*blockDim.x - 1 + ykolik*dimX + thrj+1 ]; - else - sArray[ykolik][thrj+1] = std::numeric_limits< Real >::max(); + if( dimY > (blockIdx.y+1) * blockDim.y && thrj+1 < xkolik ) + sArray[ ykolik*sizeSArray + thrj+1 ] = aux[ blockIdx.y*blockDim.y*dimX - dimX + blockIdx.x*blockDim.x - 1 + ykolik*dimX + thrj+1 ]; + else + sArray[ykolik*sizeSArray + thrj+1] = std::numeric_limits< Real >::max(); + } if( thri == 3 ) { - if( blIdy != 0 && thrj+1 < xkolik ) - sArray[0][thrj+1] = aux[ blIdy*blockDim.y*dimX - dimX + blIdx*blockDim.x - 1 + thrj+1 ]; - else - sArray[0][thrj+1] = std::numeric_limits< Real >::max(); + if( blockIdx.y != 0 && thrj+1 < xkolik ) + sArray[0*sizeSArray + thrj+1] = aux[ blockIdx.y*blockDim.y*dimX - dimX + blockIdx.x*blockDim.x - 1 + thrj+1 ]; + else + sArray[0*sizeSArray + thrj+1] = std::numeric_limits< Real >::max(); } - - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() ) + if( i < dimX && j < dimY ) { - sArray[thrj+1][thri+1] = aux[ j*mesh.getDimensions().x() + i ]; + sArray[(thrj+1)*sizeSArray + thri+1] = aux[ j*dimX + i ]; } __syncthreads(); - + while( changed[ 0 ] ) { - __syncthreads(); - - changed[ currentIndex] = false; - - //calculation of update cell - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() ) - { - if( ! interfaceMap[ j * mesh.getDimensions().x() + i ] ) - { - changed[ currentIndex ] = ptr.updateCell( sArray, thri+1, thrj+1, hx,hy); - } - } - __syncthreads(); - - //pyramid reduction - if( blockDim.x*blockDim.y == 1024 ) + __syncthreads(); + + changed[ currentIndex] = false; + + //calculation of update cell + if( i < dimX && j < dimY ) + { + if( ! interfaceMap[ j * dimX + i ] ) { - if( currentIndex < 512 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 512 ]; - } + changed[ currentIndex ] = ptr.updateCell<sizeSArray>( sArray, thri+1, thrj+1, hx,hy); } - __syncthreads(); - if( blockDim.x*blockDim.y >= 512 ) + } + __syncthreads(); + + //pyramid reduction + if( blockDim.x*blockDim.y == 1024 ) + { + if( currentIndex < 512 ) { - if( currentIndex < 256 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 256 ]; - } + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 512 ]; } - __syncthreads(); - if( blockDim.x*blockDim.y >= 256 ) + } + __syncthreads(); + if( blockDim.x*blockDim.y >= 512 ) + { + if( currentIndex < 256 ) { - if( currentIndex < 128 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 128 ]; - } + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 256 ]; } - __syncthreads(); - if( blockDim.x*blockDim.y >= 128 ) + } + __syncthreads(); + if( blockDim.x*blockDim.y >= 256 ) + { + if( currentIndex < 128 ) { - if( currentIndex < 64 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 64 ]; - } + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 128 ]; } - __syncthreads(); - if( currentIndex < 32 ) //POUZE IF JSOU SINCHRONNI NA JEDNOM WARPU + } + __syncthreads(); + if( blockDim.x*blockDim.y >= 128 ) + { + if( currentIndex < 64 ) { - if( true ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 32 ]; - if( currentIndex < 16 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 16 ]; - if( currentIndex < 8 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 8 ]; - if( currentIndex < 4 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 4 ]; - if( currentIndex < 2 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 2 ]; - if( currentIndex < 1 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 1 ]; + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 64 ]; } - if( changed[ 0 ] && thri == 0 && thrj == 0 ) - BlockIterDevice[ blIdy * numOfBlockx + blIdx ] = 1; - __syncthreads(); + } + __syncthreads(); + if( currentIndex < 32 ) + { + if( true ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 32 ]; + if( currentIndex < 16 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 16 ]; + if( currentIndex < 8 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 8 ]; + if( currentIndex < 4 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 4 ]; + if( currentIndex < 2 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 2 ]; + if( currentIndex < 1 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 1 ]; + } + if( thri == 0 && thrj == 0 && changed[ 0 ] ){ + BlockIterDevice[ blockIdx.y * gridDim.x + blockIdx.x ] = 1; + } + /*if( thri==0 && thrj == 0 && blockIdx.x == 0 && blockIdx.y == 0 ) + { + for( int k = 15; k>-1; k-- ){ + for( int l = 0; l < 16; l++ ) + printf( "%f\t", sArray[k * 16 + l]); + printf( "\n"); + } + printf( "\n"); + }*/ + __syncthreads(); } - - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && (!interfaceMap[ j * mesh.getDimensions().x() + i ]) ) - aux[ j * mesh.getDimensions().x() + i ] = sArray[ thrj + 1 ][ thri + 1 ]; + if( i < dimX && j < dimY ) + helpFunc[ j * dimX + i ] = sArray[ ( thrj + 1 ) * sizeSArray + thri + 1 ]; + + } } #endif diff --git a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h index b024979cc6247022bd3ee156c877c2b47f71f99a..5af33cf29605ce983d75b61846ceeafeada7fde0 100644 --- a/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h +++ b/src/TNL/Experimental/Hamilton-Jacobi/Solvers/hamilton-jacobi/tnlFastSweepingMethod3D_impl.h @@ -16,496 +16,649 @@ #include "tnlFastSweepingMethod.h" template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Anisotropy >:: FastSweepingMethod() : maxIterations( 1 ) { - + } template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > const Index& FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Anisotropy >:: getMaxIterations() const { - + } template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Anisotropy >:: setMaxIterations( const IndexType& maxIterations ) { - + } template< typename Real, - typename Device, - typename Index, - typename Anisotropy > + typename Device, + typename Index, + typename Anisotropy > void FastSweepingMethod< Meshes::Grid< 3, Real, Device, Index >, Anisotropy >:: solve( const MeshPointer& mesh, - const AnisotropyPointer& anisotropy, - MeshFunctionPointer& u ) + const AnisotropyPointer& anisotropy, + MeshFunctionPointer& u ) { - MeshFunctionPointer auxPtr; - InterfaceMapPointer interfaceMapPtr; - auxPtr->setMesh( mesh ); - interfaceMapPtr->setMesh( mesh ); - std::cout << "Initiating the interface cells ..." << std::endl; - BaseType::initInterface( u, auxPtr, interfaceMapPtr ); -#ifdef HAVE_CUDA - cudaDeviceSynchronize(); -#endif - auxPtr->save( "aux-ini.tnl" ); - - typename MeshType::Cell cell( *mesh ); - - IndexType iteration( 0 ); - MeshFunctionType aux = *auxPtr; - InterfaceMapType interfaceMap = * interfaceMapPtr; - while( iteration < this->maxIterations ) + MeshFunctionPointer auxPtr; + InterfaceMapPointer interfaceMapPtr; + auxPtr->setMesh( mesh ); + interfaceMapPtr->setMesh( mesh ); + std::cout << "Initiating the interface cells ..." << std::endl; + BaseType::initInterface( u, auxPtr, interfaceMapPtr ); + auxPtr->save( "aux-ini.tnl" ); + + typename MeshType::Cell cell( *mesh ); + + IndexType iteration( 0 ); + MeshFunctionType aux = *auxPtr; + InterfaceMapType interfaceMap = * interfaceMapPtr; + while( iteration < this->maxIterations ) + { + if( std::is_same< DeviceType, Devices::Host >::value ) { - if( std::is_same< DeviceType, Devices::Host >::value ) - { - 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(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-1.tnl" ); - - 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() = mesh->getDimensions().x() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - //std::cerr << "2 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-2.tnl" ); - for( cell.getCoordinates().z() = 0; - cell.getCoordinates().z() < mesh->getDimensions().z(); - cell.getCoordinates().z()++ ) - { - for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; - cell.getCoordinates().y() >= 0 ; - cell.getCoordinates().y()-- ) - { - for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh->getDimensions().x(); - cell.getCoordinates().x()++ ) - { - //std::cerr << "3 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-3.tnl" ); - - for( cell.getCoordinates().z() = 0; - cell.getCoordinates().z() < mesh->getDimensions().z(); - cell.getCoordinates().z()++ ) - { - for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; - cell.getCoordinates().y() >= 0; - cell.getCoordinates().y()-- ) - { - for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - //std::cerr << "4 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-4.tnl" ); - - for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; - cell.getCoordinates().z() >= 0; - 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()++ ) - { - //std::cerr << "5 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-5.tnl" ); - - for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; - cell.getCoordinates().z() >= 0; - cell.getCoordinates().z()-- ) - { - for( cell.getCoordinates().y() = 0; - cell.getCoordinates().y() < mesh->getDimensions().y(); - cell.getCoordinates().y()++ ) - { - for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - //std::cerr << "6 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-6.tnl" ); - - for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; - cell.getCoordinates().z() >= 0; - cell.getCoordinates().z()-- ) - { - for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; - cell.getCoordinates().y() >= 0 ; - cell.getCoordinates().y()-- ) - { - for( cell.getCoordinates().x() = 0; - cell.getCoordinates().x() < mesh->getDimensions().x(); - cell.getCoordinates().x()++ ) - { - //std::cerr << "7 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - //aux.save( "aux-7.tnl" ); - - for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; - cell.getCoordinates().z() >= 0; - cell.getCoordinates().z()-- ) - { - for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; - cell.getCoordinates().y() >= 0; - cell.getCoordinates().y()-- ) - { - for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; - cell.getCoordinates().x() >= 0 ; - cell.getCoordinates().x()-- ) - { - //std::cerr << "8 -> "; - cell.refresh(); - if( ! interfaceMap( cell ) ) - this->updateCell( aux, cell ); - } - } - } - } - if( std::is_same< DeviceType, Devices::Cuda >::value ) - { - // TODO: CUDA code -#ifdef HAVE_CUDA - 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 ); - - tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > ptr; - - int *BlockIterDevice; - int BlockIterD = 1; - - cudaMalloc(&BlockIterDevice, ( numBlocksX * numBlocksY * numBlocksZ ) * sizeof( int ) ); - int nBlocks = ( numBlocksX * numBlocksY * numBlocksZ )/512 + ((( numBlocksX * numBlocksY * numBlocksZ )%512 != 0) ? 1:0); - int *dBlock; - cudaMalloc(&dBlock, nBlocks * sizeof( int ) ); - - while( BlockIterD ) - { - CudaUpdateCellCaller<<< gridSize, blockSize >>>( ptr, - interfaceMapPtr.template getData< Device >(), - auxPtr.template modifyData< Device>(), - BlockIterDevice ); - CudaParallelReduc<<< nBlocks , 512 >>>( BlockIterDevice, dBlock, ( numBlocksX * numBlocksY * numBlocksZ ) ); - CudaParallelReduc<<< 1, nBlocks >>>( dBlock, dBlock, nBlocks ); - - cudaMemcpy(&BlockIterD, &dBlock[0], sizeof( int ), cudaMemcpyDeviceToHost); - - /*for( int i = 1; i < numBlocksX * numBlocksY; i++ ) - BlockIter[ 0 ] = BlockIter[ 0 ] || BlockIter[ i ];*/ - + int numThreadsPerBlock = 64; + + + int numBlocksX = mesh->getDimensions().x() / numThreadsPerBlock + (mesh->getDimensions().x() % numThreadsPerBlock != 0 ? 1:0); + int numBlocksY = mesh->getDimensions().y() / numThreadsPerBlock + (mesh->getDimensions().y() % numThreadsPerBlock != 0 ? 1:0); + int numBlocksZ = mesh->getDimensions().z() / numThreadsPerBlock + (mesh->getDimensions().z() % numThreadsPerBlock != 0 ? 1:0); + //std::cout << "numBlocksX = " << numBlocksX << std::endl; + + /*Real **sArray = new Real*[numBlocksX*numBlocksY]; + for( int i = 0; i < numBlocksX * numBlocksY; i++ ) + sArray[ i ] = new Real [ (numThreadsPerBlock + 2)*(numThreadsPerBlock + 2)];*/ + + ArrayContainer BlockIterHost; + BlockIterHost.setSize( numBlocksX * numBlocksY * numBlocksZ ); + BlockIterHost.setValue( 1 ); + int IsCalculationDone = 1; + + MeshFunctionPointer helpFunc( mesh ); + MeshFunctionPointer helpFunc1( mesh ); + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + //std::cout<< "Size = " << BlockIterHost.getSize() << std::endl; + /*for( int k = numBlocksX-1; k >-1; k-- ){ + for( int l = 0; l < numBlocksY; l++ ){ + std::cout<< BlockIterHost[ l*numBlocksX + k ]; + } + std::cout<<std::endl; + } + std::cout<<std::endl;*/ + unsigned int numWhile = 0; + while( IsCalculationDone ) + { + IsCalculationDone = 0; + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + this->template updateBlocks< 66 >( interfaceMap, *auxPtr, *helpFunc, BlockIterHost, numThreadsPerBlock/*, sArray*/ ); + + //Reduction + for( int i = 0; i < BlockIterHost.getSize(); i++ ){ + if( IsCalculationDone == 0 ){ + IsCalculationDone = IsCalculationDone || BlockIterHost[ i ]; + //break; } - cudaFree( BlockIterDevice ); - cudaFree( dBlock ); - cudaDeviceSynchronize(); - TNL_CHECK_CUDA_DEVICE; - aux = *auxPtr; - interfaceMap = *interfaceMapPtr; -#endif - } + } + numWhile++; + std::cout <<"numWhile = "<< numWhile <<std::endl; + /*for( int k = 0; k < numBlocksZ; k++ ){ + for( int j = numBlocksY-1; j>-1; j-- ){ + for( int i = 0; i < numBlocksX; i++ ){ + //std::cout << (*auxPtr)[ k * numBlocksX * numBlocksY + j * numBlocksX + i ] << " "; + std::cout << BlockIterHost[ k * numBlocksX * numBlocksY + j * numBlocksX + i ]; + } + std::cout << std::endl; + } + std::cout << std::endl; + } + std::cout << std::endl;*/ + + this->getNeighbours( BlockIterHost, numBlocksX, numBlocksY, numBlocksZ ); - //aux.save( "aux-8.tnl" ); - iteration++; + /*for( int k = 0; k < numBlocksZ; k++ ){ + for( int j = numBlocksY-1; j>-1; j-- ){ + for( int i = 0; i < numBlocksX; i++ ){ + //std::cout << (*auxPtr)[ k * numBlocksX * numBlocksY + j * numBlocksX + i ] << " "; + std::cout << BlockIterHost[ k * numBlocksX * numBlocksY + j * numBlocksX + i ]; + } + std::cout << std::endl; + } + std::cout << std::endl; + }*/ + + /*for( int j = numBlocksY-1; j>-1; j-- ){ + for( int i = 0; i < numBlocksX; i++ ) + std::cout << "BlockIterHost = "<< j*numBlocksX + i<< " ," << BlockIterHost[ j * numBlocksX + i ]; + std::cout << std::endl; + } + std::cout << std::endl;*/ + + //std::cout<<std::endl; + //string s( "aux-"+ std::to_string(numWhile) + ".tnl"); + //aux.save( s ); + } + if( numWhile == 1 ){ + auxPtr = helpFunc; + } + aux = *auxPtr; + + /*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(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-1.tnl" ); + + 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() = mesh->getDimensions().x() - 1; + cell.getCoordinates().x() >= 0 ; + cell.getCoordinates().x()-- ) + { + //std::cerr << "2 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-2.tnl" ); + for( cell.getCoordinates().z() = 0; + cell.getCoordinates().z() < mesh->getDimensions().z(); + cell.getCoordinates().z()++ ) + { + for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; + cell.getCoordinates().y() >= 0 ; + cell.getCoordinates().y()-- ) + { + for( cell.getCoordinates().x() = 0; + cell.getCoordinates().x() < mesh->getDimensions().x(); + cell.getCoordinates().x()++ ) + { + //std::cerr << "3 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-3.tnl" ); + + for( cell.getCoordinates().z() = 0; + cell.getCoordinates().z() < mesh->getDimensions().z(); + cell.getCoordinates().z()++ ) + { + for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; + cell.getCoordinates().y() >= 0; + cell.getCoordinates().y()-- ) + { + for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; + cell.getCoordinates().x() >= 0 ; + cell.getCoordinates().x()-- ) + { + //std::cerr << "4 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-4.tnl" ); + + for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; + cell.getCoordinates().z() >= 0; + 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()++ ) + { + //std::cerr << "5 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-5.tnl" ); + + for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; + cell.getCoordinates().z() >= 0; + cell.getCoordinates().z()-- ) + { + for( cell.getCoordinates().y() = 0; + cell.getCoordinates().y() < mesh->getDimensions().y(); + cell.getCoordinates().y()++ ) + { + for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; + cell.getCoordinates().x() >= 0 ; + cell.getCoordinates().x()-- ) + { + //std::cerr << "6 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-6.tnl" ); + + for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; + cell.getCoordinates().z() >= 0; + cell.getCoordinates().z()-- ) + { + for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; + cell.getCoordinates().y() >= 0 ; + cell.getCoordinates().y()-- ) + { + for( cell.getCoordinates().x() = 0; + cell.getCoordinates().x() < mesh->getDimensions().x(); + cell.getCoordinates().x()++ ) + { + //std::cerr << "7 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + } + //aux.save( "aux-7.tnl" ); + + for( cell.getCoordinates().z() = mesh->getDimensions().z() - 1; + cell.getCoordinates().z() >= 0; + cell.getCoordinates().z()-- ) + { + for( cell.getCoordinates().y() = mesh->getDimensions().y() - 1; + cell.getCoordinates().y() >= 0; + cell.getCoordinates().y()-- ) + { + for( cell.getCoordinates().x() = mesh->getDimensions().x() - 1; + cell.getCoordinates().x() >= 0 ; + cell.getCoordinates().x()-- ) + { + //std::cerr << "8 -> "; + cell.refresh(); + if( ! interfaceMap( cell ) ) + this->updateCell( aux, cell ); + } + } + }*/ + } + if( std::is_same< DeviceType, Devices::Cuda >::value ) + { + // TODO: CUDA code +#ifdef HAVE_CUDA + 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 ); + + tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > ptr; + + + int BlockIterD = 1; + + TNL::Containers::Array< int, Devices::Cuda, IndexType > BlockIterDevice; + BlockIterDevice.setSize( numBlocksX * numBlocksY * numBlocksZ ); + BlockIterDevice.setValue( 1 ); + TNL::Containers::Array< int, Devices::Cuda, IndexType > BlockIterPom; + BlockIterPom.setSize( numBlocksX * numBlocksY * numBlocksZ ); + BlockIterPom.setValue( 0 ); + /*int *BlockIterDevice; + cudaMalloc(&BlockIterDevice, ( numBlocksX * numBlocksY * numBlocksZ ) * sizeof( int ) );*/ + int nBlocks = ( numBlocksX * numBlocksY * numBlocksZ )/512 + ((( numBlocksX * numBlocksY * numBlocksZ )%512 != 0) ? 1:0); - } - aux.save("aux-final.tnl"); + TNL::Containers::Array< int, Devices::Cuda, IndexType > dBlock; + dBlock.setSize( nBlocks ); + dBlock.setValue( 0 ); + + int nBlocksNeigh = ( numBlocksX * numBlocksY * numBlocksZ )/1024 + ((( numBlocksX * numBlocksY * numBlocksZ )%1024 != 0) ? 1:0); + /*int *dBlock; + cudaMalloc(&dBlock, nBlocks * sizeof( int ) );*/ + MeshFunctionPointer helpFunc1( mesh ); + MeshFunctionPointer helpFunc( mesh ); + + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + int numIter = 0; + + while( BlockIterD ) + { + helpFunc1 = auxPtr; + auxPtr = helpFunc; + helpFunc = helpFunc1; + TNL_CHECK_CUDA_DEVICE; + + CudaUpdateCellCaller< 10 ><<< gridSize, blockSize >>>( ptr, + interfaceMapPtr.template getData< Device >(), + auxPtr.template getData< Device>(), + helpFunc.template modifyData< Device>(), + BlockIterDevice ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + + GetNeighbours3D<<< nBlocksNeigh, 1024 >>>( BlockIterDevice, BlockIterPom, numBlocksX, numBlocksY, numBlocksZ ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + BlockIterDevice = BlockIterPom; + + CudaParallelReduc<<< nBlocks , 512 >>>( BlockIterDevice, dBlock, ( numBlocksX * numBlocksY * numBlocksZ ) ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + + CudaParallelReduc<<< 1, nBlocks >>>( dBlock, dBlock, nBlocks ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + cudaMemcpy(&BlockIterD, &dBlock[0], sizeof( int ), cudaMemcpyDeviceToHost); + numIter++; + /*for( int i = 1; i < numBlocksX * numBlocksY; i++ ) + BlockIter[ 0 ] = BlockIter[ 0 ] || BlockIter[ i ];*/ + + } + if( numIter == 1 ){ + auxPtr = helpFunc; + } + //cudaFree( BlockIterDevice ); + //cudaFree( dBlock ); + cudaDeviceSynchronize(); + TNL_CHECK_CUDA_DEVICE; + aux = *auxPtr; + interfaceMap = *interfaceMapPtr; +#endif + } + + //aux.save( "aux-8.tnl" ); + iteration++; + + } + aux.save("aux-final.tnl"); } #ifdef HAVE_CUDA -template < typename Real, typename Device, typename Index > +template < typename Index > +__global__ void GetNeighbours3D( TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterPom, + int numBlockX, int numBlockY, int numBlockZ ) +{ + int i = blockIdx.x * 1024 + threadIdx.x; + + if( i < numBlockX * numBlockY * numBlockZ ) + { + int pom = 0;//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 && BlockIterDevice[ i - 1 ] ){ + pom = 1;//BlockIterPom[ i ] = 1; + }else if( m < numBlockX -1 && BlockIterDevice[ i + 1 ] ){ + pom = 1;//BlockIterPom[ i ] = 1; + }else if( k > 0 && BlockIterDevice[ i - numBlockX ] ){ + pom = 1;// BlockIterPom[ i ] = 1; + }else if( k < numBlockY -1 && BlockIterDevice[ i + numBlockX ] ){ + pom = 1;//BlockIterPom[ i ] = 1; + }else if( l > 0 && BlockIterDevice[ i - numBlockX*numBlockY ] ){ + pom = 1; + }else if( l < numBlockZ-1 && BlockIterDevice[ i + numBlockX*numBlockY ] ){ + pom = 1; + } + + BlockIterPom[ i ] = pom;//BlockIterPom[ i ]; + } +} + +template < int sizeSArray, typename Real, typename Device, typename Index > __global__ void CudaUpdateCellCaller( tnlDirectEikonalMethodsBase< Meshes::Grid< 3, Real, Device, Index > > ptr, - const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap, - Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& aux, - int *BlockIterDevice ) + const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index >, 3, bool >& interfaceMap, + const Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& aux, + Functions::MeshFunction< Meshes::Grid< 3, Real, Device, Index > >& helpFunc, + TNL::Containers::Array< int, Devices::Cuda, Index > BlockIterDevice ) { - int thri = threadIdx.x; int thrj = threadIdx.y; int thrk = threadIdx.z; - int blIdx = blockIdx.x; int blIdy = blockIdx.y; int blIdz = blockIdx.z; - int i = threadIdx.x + blockDim.x*blockIdx.x; - int j = blockDim.y*blockIdx.y + threadIdx.y; - int k = blockDim.z*blockIdx.z + threadIdx.z; - int currentIndex = thrk * blockDim.x * blockDim.y + thrj * blockDim.x + thri; + int thri = threadIdx.x; int thrj = threadIdx.y; int thrk = threadIdx.z; + int blIdx = blockIdx.x; int blIdy = blockIdx.y; int blIdz = blockIdx.z; + int i = threadIdx.x + blockDim.x*blockIdx.x; + int j = blockDim.y*blockIdx.y + threadIdx.y; + int k = blockDim.z*blockIdx.z + threadIdx.z; + int currentIndex = thrk * blockDim.x * blockDim.y + thrj * blockDim.x + thri; + + if( BlockIterDevice[ blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x ] ) + { + __syncthreads(); - __shared__ volatile bool changed[8*8*8]; - changed[ currentIndex ] = false; + __shared__ volatile bool changed[ 8*8*8/*(sizeSArray - 2)*(sizeSArray - 2)*(sizeSArray - 2)*/]; + changed[ currentIndex ] = false; if( thrj == 0 && thri == 0 && thrk == 0 ) - changed[ 0 ] = true; + changed[ 0 ] = true; const Meshes::Grid< 3, Real, Device, Index >& mesh = interfaceMap.template getMesh< Devices::Cuda >(); - __shared__ Real hx; - __shared__ Real hy; - __shared__ Real hz; + __shared__ Real hx; __shared__ int dimX; + __shared__ Real hy; __shared__ int dimY; + __shared__ Real hz; __shared__ int dimZ; + if( thrj == 1 && thri == 1 && thrk == 1 ) { - hx = mesh.getSpaceSteps().x(); - hy = mesh.getSpaceSteps().y(); - hz = mesh.getSpaceSteps().z(); + //printf( "We are in the calculation. Block = %d.\n",blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x ); + hx = mesh.getSpaceSteps().x(); + hy = mesh.getSpaceSteps().y(); + hz = mesh.getSpaceSteps().z(); + dimX = mesh.getDimensions().x(); + dimY = mesh.getDimensions().y(); + dimZ = mesh.getDimensions().z(); + BlockIterDevice[ blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x ] = 0; } - __shared__ volatile Real sArray[10][10][10]; - sArray[thrk][thrj][thri] = std::numeric_limits< Real >::max(); - if(thri == 0 ) - { - sArray[8][thrj+1][thrk+1] = std::numeric_limits< Real >::max(); - sArray[9][thrj+1][thrk+1] = std::numeric_limits< Real >::max(); - sArray[thrk+1][thrj+1][8] = std::numeric_limits< Real >::max(); - sArray[thrk+1][thrj+1][9] = std::numeric_limits< Real >::max(); - sArray[thrj+1][8][thrk+1] = std::numeric_limits< Real >::max(); - sArray[thrj+1][9][thrk+1] = std::numeric_limits< Real >::max(); - } - + __shared__ volatile Real sArray[ 10*10*10/*sizeSArray * sizeSArray * sizeSArray*/ ]; + sArray[(thrk+1)* sizeSArray * sizeSArray + (thrj+1) *sizeSArray + thri+1] = std::numeric_limits< Real >::max(); + //filling sArray edges - int dimX = mesh.getDimensions().x(); int dimY = mesh.getDimensions().y(); - int dimZ = mesh.getDimensions().z(); - __shared__ volatile int numOfBlockx; - __shared__ volatile int numOfBlocky; - __shared__ volatile int numOfBlockz; - __shared__ int xkolik; - __shared__ int ykolik; - __shared__ int zkolik; - if( thri == 0 && thrj == 0 && thrk == 0 ) - { - xkolik = blockDim.x + 1; - ykolik = blockDim.y + 1; - zkolik = blockDim.z + 1; - numOfBlocky = dimY/blockDim.y + ((dimY%blockDim.y != 0) ? 1:0); - numOfBlockx = dimX/blockDim.x + ((dimX%blockDim.x != 0) ? 1:0); - numOfBlockz = dimZ/blockDim.z + ((dimZ%blockDim.z != 0) ? 1:0); - - if( numOfBlockx - 1 == blIdx ) - xkolik = dimX - (blIdx)*blockDim.x+1; - - if( numOfBlocky -1 == blIdy ) - ykolik = dimY - (blIdy)*blockDim.y+1; - if( numOfBlockz-1 == blIdz ) - zkolik = dimZ - (blIdz)*blockDim.z+1; - - BlockIterDevice[ blIdz * numOfBlockx * numOfBlocky + blIdy * numOfBlockx + blIdx ] = 0; - } + int numOfBlockx; + int numOfBlocky; + int numOfBlockz; + int xkolik; + int ykolik; + int zkolik; + xkolik = blockDim.x + 1; + ykolik = blockDim.y + 1; + zkolik = blockDim.z + 1; + numOfBlockx = gridDim.x; + numOfBlocky = gridDim.y; + numOfBlockz = gridDim.z; + __syncthreads(); + + if( numOfBlockx - 1 == blIdx ) + xkolik = dimX - (blIdx)*blockDim.x+1; + if( numOfBlocky -1 == blIdy ) + ykolik = dimY - (blIdy)*blockDim.y+1; + if( numOfBlockz-1 == blIdz ) + zkolik = dimZ - (blIdz)*blockDim.z+1; __syncthreads(); if( thri == 0 ) { - if( blIdx != 0 && thrj+1 < ykolik && thrk+1 < zkolik ) - sArray[thrk+1][thrj+1][0] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x + thrj * dimX -1 + thrk*dimX*dimY ]; - else - sArray[thrk+1][thrj+1][0] = std::numeric_limits< Real >::max(); + if( blIdx != 0 && thrj+1 < ykolik && thrk+1 < zkolik ) + sArray[(thrk+1 )* sizeSArray * sizeSArray + (thrj+1)*sizeSArray + 0] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x + thrj * dimX -1 + thrk*dimX*dimY ]; + else + sArray[(thrk+1)* sizeSArray * sizeSArray + (thrj+1)*sizeSArray + 0] = std::numeric_limits< Real >::max(); } if( thri == 1 ) { - if( dimX > (blIdx+1) * blockDim.x && thrj+1 < ykolik && thrk+1 < zkolik ) - sArray[thrk+1][thrj+1][9] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy *blockDim.y*dimX+ blIdx*blockDim.x + blockDim.x + thrj * dimX + thrk*dimX*dimY ]; - else - sArray[thrk+1][thrj+1][9] = std::numeric_limits< Real >::max(); + if( dimX > (blIdx+1) * blockDim.x && thrj+1 < ykolik && thrk+1 < zkolik ) + sArray[ (thrk+1) * sizeSArray * sizeSArray + (thrj+1) *sizeSArray + xkolik ] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy *blockDim.y*dimX+ blIdx*blockDim.x + blockDim.x + thrj * dimX + thrk*dimX*dimY ]; + else + sArray[ (thrk+1) * sizeSArray * sizeSArray + (thrj+1)*sizeSArray + xkolik] = std::numeric_limits< Real >::max(); } if( thri == 2 ) { - if( blIdy != 0 && thrj+1 < xkolik && thrk+1 < zkolik ) - sArray[thrk+1][0][thrj+1] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x - dimX + thrj + thrk*dimX*dimY ]; - else - sArray[thrk+1][0][thrj+1] = std::numeric_limits< Real >::max(); + if( blIdy != 0 && thrj+1 < xkolik && thrk+1 < zkolik ) + sArray[ (thrk+1) * sizeSArray * sizeSArray +0*sizeSArray + thrj+1] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x - dimX + thrj + thrk*dimX*dimY ]; + else + sArray[ (thrk+1) * sizeSArray * sizeSArray + 0*sizeSArray + thrj+1] = std::numeric_limits< Real >::max(); } if( thri == 3 ) { - if( dimY > (blIdy+1) * blockDim.y && thrj+1 < xkolik && thrk+1 < zkolik ) - sArray[thrk+1][9][thrj+1] = aux[ blIdz*blockDim.z * dimX * dimY + (blIdy+1) * blockDim.y*dimX + blIdx*blockDim.x + thrj + thrk*dimX*dimY ]; - else - sArray[thrk+1][9][thrj+1] = std::numeric_limits< Real >::max(); + if( dimY > (blIdy+1) * blockDim.y && thrj+1 < xkolik && thrk+1 < zkolik ) + sArray[ (thrk+1) * sizeSArray * sizeSArray + ykolik*sizeSArray + thrj+1] = aux[ blIdz*blockDim.z * dimX * dimY + (blIdy+1) * blockDim.y*dimX + blIdx*blockDim.x + thrj + thrk*dimX*dimY ]; + else + sArray[ (thrk+1) * sizeSArray * sizeSArray + ykolik*sizeSArray + thrj+1] = std::numeric_limits< Real >::max(); } if( thri == 4 ) { - if( blIdz != 0 && thrj+1 < ykolik && thrk+1 < xkolik ) - sArray[0][thrj+1][thrk+1] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x - dimX * dimY + thrj * dimX + thrk ]; - else - sArray[0][thrj+1][thrk+1] = std::numeric_limits< Real >::max(); + if( blIdz != 0 && thrj+1 < ykolik && thrk+1 < xkolik ) + sArray[ 0 * sizeSArray * sizeSArray +(thrj+1 )* sizeSArray + thrk+1] = aux[ blIdz*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x - dimX * dimY + thrj * dimX + thrk ]; + else + sArray[0 * sizeSArray * sizeSArray + (thrj+1) *sizeSArray + thrk+1] = std::numeric_limits< Real >::max(); } if( thri == 5 ) { - if( dimZ > (blIdz+1) * blockDim.z && thrj+1 < ykolik && thrk+1 < xkolik ) - sArray[9][thrj+1][thrk+1] = aux[ (blIdz+1)*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x + thrj * dimX + thrk ]; - else - sArray[9][thrj+1][thrk+1] = std::numeric_limits< Real >::max(); + if( dimZ > (blIdz+1) * blockDim.z && thrj+1 < ykolik && thrk+1 < xkolik ) + sArray[zkolik * sizeSArray * sizeSArray + (thrj+1) * sizeSArray + thrk+1] = aux[ (blIdz+1)*blockDim.z * dimX * dimY + blIdy * blockDim.y*dimX + blIdx*blockDim.x + thrj * dimX + thrk ]; + else + sArray[zkolik * sizeSArray * sizeSArray + (thrj+1) * sizeSArray + thrk+1] = std::numeric_limits< Real >::max(); } - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && k < mesh.getDimensions().z() ) + if( i < dimX && j < dimY && k < dimZ ) { - sArray[thrk+1][thrj+1][thri+1] = aux[ k*dimX*dimY + j*dimX + i ]; + sArray[(thrk+1) * sizeSArray * sizeSArray + (thrj+1) *sizeSArray + thri+1] = aux[ k*dimX*dimY + j*dimX + i ]; } - __shared__ volatile int loopcounter; - loopcounter = 0; __syncthreads(); + while( changed[ 0 ] ) { - __syncthreads(); - - changed[ currentIndex ] = false; - - //calculation of update cell - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && k < dimZ ) - { - if( ! interfaceMap[ k*dimX*dimY + j * mesh.getDimensions().x() + i ] ) - { - changed[ currentIndex ] = ptr.updateCell( sArray, thri+1, thrj+1, thrk+1, hx,hy,hz); - } - } - __syncthreads(); - - //pyramid reduction - if( blockDim.x*blockDim.y*blockDim.z == 1024 ) - { - if( currentIndex < 512 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 512 ]; - } - } - __syncthreads(); - if( blockDim.x*blockDim.y*blockDim.z >= 512 ) + __syncthreads(); + + changed[ currentIndex ] = false; + + //calculation of update cell + if( i < dimX && j < dimY && k < dimZ ) + { + if( ! interfaceMap[ k*dimX*dimY + j * dimX + i ] ) { - if( currentIndex < 256 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 256 ]; - } + changed[ currentIndex ] = ptr.updateCell3D< sizeSArray >( sArray, thri+1, thrj+1, thrk+1, hx,hy,hz); } - __syncthreads(); - if( blockDim.x*blockDim.y*blockDim.z >= 256 ) + } + __syncthreads(); + + //pyramid reduction + if( blockDim.x*blockDim.y*blockDim.z == 1024 ) + { + if( currentIndex < 512 ) { - if( currentIndex < 128 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 128 ]; - } + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 512 ]; } - __syncthreads(); - if( blockDim.x*blockDim.y*blockDim.z >= 128 ) + } + __syncthreads(); + if( blockDim.x*blockDim.y*blockDim.z >= 512 ) + { + if( currentIndex < 256 ) { - if( currentIndex < 64 ) - { - changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 64 ]; - } + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 256 ]; } - __syncthreads(); - if( currentIndex < 32 ) //POUZE IF JSOU SINCHRONNI NA JEDNOM WARPU + } + __syncthreads(); + if( blockDim.x*blockDim.y*blockDim.z >= 256 ) + { + if( currentIndex < 128 ) { - if( true ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 32 ]; - if( currentIndex < 16 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 16 ]; - if( currentIndex < 8 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 8 ]; - if( currentIndex < 4 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 4 ]; - if( currentIndex < 2 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 2 ]; - if( currentIndex < 1 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 1 ]; + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 128 ]; } - __syncthreads(); - - /*if(thri == 0 && thrj ==0 && thrk ==0 && blIdx == 0 && blIdy == 0 && blIdz == 0) - { - for(int m = 0; m < 8; m++){ - for(int n = 0; n<8; n++){ - for(int b=0; b<8; b++) - printf(" %i ", changed[m*64 + n*8 + b]); - printf("\n"); - } - printf("\n \n"); - } - }*/ - if( changed[ 0 ] && thri == 0 && thrj == 0 && thrk == 0 ) + } + __syncthreads(); + if( blockDim.x*blockDim.y*blockDim.z >= 128 ) + { + if( currentIndex < 64 ) { - //loopcounter++; - BlockIterDevice[ blIdz * numOfBlockx * numOfBlocky + blIdy * numOfBlockx + blIdx ] = 1; + changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 64 ]; } - __syncthreads(); - /*if(thri == 0 && thrj==0 && thrk==0) - printf("%i \n",loopcounter); - if(loopcounter == 500) - break;*/ + } + __syncthreads(); + if( currentIndex < 32 ) + { + if( true ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 32 ]; + if( currentIndex < 16 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 16 ]; + if( currentIndex < 8 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 8 ]; + if( currentIndex < 4 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 4 ]; + if( currentIndex < 2 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 2 ]; + if( currentIndex < 1 ) changed[ currentIndex ] = changed[ currentIndex ] || changed[ currentIndex + 1 ]; + } + __syncthreads(); + + /*if(thri == 0 && thrj ==0 && thrk ==0 && blIdx == 0 && blIdy == 0 && blIdz == 0) + { + //for(int m = 0; m < 8; m++){ + int m = 4; + for(int n = 0; n<8; n++){ + for(int b=0; b<8; b++) + printf(" %i ", changed[m*64 + n*8 + b]); + printf("\n"); + } + printf("\n \n"); + } + //}*/ + + if( changed[ 0 ] && thri == 0 && thrj == 0 && thrk == 0 ) + { + //printf( "Setting block calculation. Block = %d.\n",blockIdx.z * gridDim.x * gridDim.y + blockIdx.y * gridDim.x + blockIdx.x ); + BlockIterDevice[ blIdz * gridDim.x * gridDim.y + blIdy * gridDim.x + blIdx ] = 1; + } + __syncthreads(); } - - if( i < mesh.getDimensions().x() && j < mesh.getDimensions().y() && k < dimZ && (!interfaceMap[ k*dimX*dimY+j * mesh.getDimensions().x() + i ]) ) - aux[ k*dimX*dimY + j * mesh.getDimensions().x() + i ] = sArray[thrk+1][ thrj + 1 ][ thri + 1 ]; -} + + if( i < dimX && j < dimY && k < dimZ ) + helpFunc[ k*dimX*dimY + j * dimX + i ] = sArray[ (thrk+1) * sizeSArray * sizeSArray + (thrj+1) * sizeSArray + thri+1 ]; + + } +} #endif