Commit 13817800 authored by Tomáš Oberhuber's avatar Tomáš Oberhuber
Browse files

Writting documentation on multidiagonal martrix + implementing constructors with initializer lists.

parent ca11c5d8
Loading
Loading
Loading
Loading
+33 −11
Original line number Diff line number Diff line
IF( BUILD_CUDA )
#   CUDA_ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_init_list_cuda MultidiagonalMatrixExample_Constructor_init_list.cu )
#   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_init_list_cuda >
#                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor_init_list.out
#                       OUTPUT MultidiagonalMatrixExample_Constructor_init_list.out )
   CUDA_ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_cuda MultidiagonalMatrixExample_Constructor.cu )
   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_cuda >
                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor.out
                       OUTPUT MultidiagonalMatrixExample_Constructor.out )

   CUDA_ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_init_list_1_cuda MultidiagonalMatrixExample_Constructor_init_list_1.cu )
   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_init_list_1_cuda >
                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor_init_list_1.out
                       OUTPUT MultidiagonalMatrixExample_Constructor_init_list_1.out )

   CUDA_ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_init_list_2_cuda MultidiagonalMatrixExample_Constructor_init_list_2.cu )
   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_init_list_2_cuda >
                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor_init_list_2.out
                       OUTPUT MultidiagonalMatrixExample_Constructor_init_list_2.out )

#   CUDA_ADD_EXECUTABLE( MultidiagonalMatrixExample_setElements_cuda MultidiagonalMatrixExample_setElements.cu )
#   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_setElements_cuda > 
@@ -125,10 +135,20 @@ IF( BUILD_CUDA )
#                       OUTPUT MultidiagonalMatrixViewExample_forAllRows.out )

ELSE()
#   ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_init_list MultidiagonalMatrixExample_Constructor_init_list.cpp )
#   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_init_list >
#                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor_init_list.out
#                       OUTPUT MultidiagonalMatrixExample_Constructor_init_list.out )
   ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor MultidiagonalMatrixExample_Constructor.cpp )
   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor >
                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor.out
                       OUTPUT MultidiagonalMatrixExample_Constructor.out )

   ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_init_list_1 MultidiagonalMatrixExample_Constructor_init_list_1.cpp )
   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_init_list_1 >
                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor_init_list_1.out
                       OUTPUT MultidiagonalMatrixExample_Constructor_init_list_1.out )

   ADD_EXECUTABLE( MultidiagonalMatrixExample_Constructor_init_list_2 MultidiagonalMatrixExample_Constructor_init_list_2.cpp )
   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_Constructor_init_list_2 >
                        ${TNL_DOCUMENTATION_OUTPUT_SNIPPETS_PATH}/MultidiagonalMatrixExample_Constructor_init_list_2.out
                       OUTPUT MultidiagonalMatrixExample_Constructor_init_list_2.out )

#   ADD_EXECUTABLE( MultidiagonalMatrixExample_setElements MultidiagonalMatrixExample_setElements.cpp )
#   ADD_CUSTOM_COMMAND( COMMAND MultidiagonalMatrixExample_setElements > 
@@ -252,8 +272,10 @@ ELSE()

ENDIF()

#ADD_CUSTOM_TARGET( RunMatricesExamples ALL DEPENDS
#   MultidiagonalMatrixExample_Constructor_init_list.out
ADD_CUSTOM_TARGET( RunMatricesExamples ALL DEPENDS
   MultidiagonalMatrixExample_Constructor.out
   MultidiagonalMatrixExample_Constructor_init_list_1.out
   MultidiagonalMatrixExample_Constructor_init_list_2.out
#   MultidiagonalMatrixExample_setElements.out
#   MultidiagonalMatrixExample_getCompressedRowLengths.out
#   MultidiagonalMatrixExample_getElementsCount.out
@@ -278,5 +300,5 @@ ENDIF()
#   MultidiagonalMatrixViewExample_allRowsReduction.out
#   MultidiagonalMatrixViewExample_forRows.out
#   MultidiagonalMatrixViewExample_forAllRows.out
#)
)
+48 −0
Original line number Diff line number Diff line
#include <iostream>
#include <TNL/Algorithms/ParallelFor.h>
#include <TNL/Matrices/MultidiagonalMatrix.h>
#include <TNL/Devices/Host.h>
#include <TNL/Devices/Cuda.h>


template< typename Device >
void laplaceOperatorMatrix()
{
   /***
    * Set  matrix representing approximation of the Laplace operator on regular
    * grid using the finite difference method.
    */
   const int gridSize( 4 );
   const int matrixSize = gridSize * gridSize;
   TNL::Containers::Vector< int, Device > shifts { - gridSize, -1, 0, 1, gridSize };
   TNL::Matrices::MultidiagonalMatrix< double, Device > matrix( matrixSize, matrixSize, shifts );
   auto matrixView = matrix.getView();
   auto f = [=] __cuda_callable__ ( int i, int j ) mutable {
      const int elementIdx = j * gridSize + i;
      auto row = matrixView.getRow( elementIdx );
      if( i == 0 || j == 0 || i == gridSize - 1 || j == gridSize - 1 )
         row.setElement( 2, 1.0 ); // set matrix elements corresponding to boundary grid nodes
      else
      {
         row.setElement( 0, -1.0 ); // set matrix elements corresponding to inner grid nodes
         row.setElement( 1, -1.0 );
         row.setElement( 2,  4.0 );
         row.setElement( 3, -1.0 );
         row.setElement( 4, -1.0 );
      }
   };
   TNL::Algorithms::ParallelFor2D< TNL::Devices::Sequential >::exec( 0, 0, gridSize, gridSize, f );

   std::cout << "Laplace operator matrix: " << std::endl << matrix << std::endl;
}

int main( int argc, char* argv[] )
{
   std::cout << "Creating Laplace operator matrix on CPU ... " << std::endl;
   laplaceOperatorMatrix< TNL::Devices::Host >();

#ifdef HAVE_CUDA
   std::cout << "Creating Laplace operator matrix on CUDA GPU ... " << std::endl;
   laplaceOperatorMatrix< TNL::Devices::Cuda >();
#endif
}
+47 −0
Original line number Diff line number Diff line
#include <iostream>
#include <TNL/Algorithms/ParallelFor.h>
#include <TNL/Matrices/MultidiagonalMatrix.h>
#include <TNL/Devices/Host.h>
#include <TNL/Devices/Cuda.h>


template< typename Device >
void laplaceOperatorMatrix()
{
   /***
    * Set  matrix representing approximation of the Laplace operator on regular
    * grid using the finite difference method.
    */
   const int gridSize( 4 );
   const int matrixSize = gridSize * gridSize;
   TNL::Matrices::MultidiagonalMatrix< double, Device > matrix( matrixSize, matrixSize, { - gridSize, -1, 0, 1, gridSize } );
   auto matrixView = matrix.getView();
   auto f = [=] __cuda_callable__ ( int i, int j ) mutable {
      const int elementIdx = i * gridSize + j;
      auto row = matrixView.getRow( elementIdx );
      if( i == 0 || j == 0 || i == gridSize - 1 || j == gridSize - 1 )
         row.setElement( 2, 1.0 ); // set matrix elements corresponding to boundary grid nodes
      else
      {
         row.setElement( 0, -1.0 ); // set matrix elements corresponding to inner grid nodes
         row.setElement( 1, -1.0 );
         row.setElement( 2,  4.0 );
         row.setElement( 3, -1.0 );
         row.setElement( 4, -1.0 );
      }
   };
   TNL::Algorithms::ParallelFor2D< Device >::exec( 0, 0, gridSize, gridSize, f );

   std::cout << "Laplace operator matrix: " << std::endl << matrix << std::endl;
}

int main( int argc, char* argv[] )
{
   std::cout << "Creating Laplace operator matrix on CPU ... " << std::endl;
   laplaceOperatorMatrix< TNL::Devices::Host >();

#ifdef HAVE_CUDA
   std::cout << "Creating Laplace operator matrix on CUDA GPU ... " << std::endl;
   initializerListExample< TNL::Devices::Cuda >();
#endif
}
+1 −0
Original line number Diff line number Diff line
MultidiagonalMatrixExample_Constructor_init_list_1.cpp
 No newline at end of file
+61 −0
Original line number Diff line number Diff line
#include <iostream>
#include <TNL/Algorithms/ParallelFor.h>
#include <TNL/Matrices/MultidiagonalMatrix.h>
#include <TNL/Devices/Host.h>
#include <TNL/Devices/Cuda.h>


template< typename Device >
void laplaceOperatorMatrix()
{
   const int gridSize( 4 );
   const int matrixSize = gridSize * gridSize;
   TNL::Matrices::MultidiagonalMatrix< double, Device > matrix( 
      matrixSize, { - gridSize, -1, 0, 1, gridSize }, {
         { 1.0 },
         { 1.0 },
         { 1.0 },
         { 1.0 },
         { 1.0 },
         { -1.0, -1.0, 4.0, -1.0, -1.0 },
         { -1.0, -1.0, 4.0, -1.0, -1.0 },
         { 1.0 },
         { 1.0 },
         { -1.0, -1.0, 4.0, -1.0, -1.0 },
         { -1.0, -1.0, 4.0, -1.0, -1.0 },
         { 1.0 },
         { 1.0 },
         { 1.0 },
         { 1.0 },
         { 1.0 }
      } );
   auto matrixView = matrix.getView();
   auto f = [=] __cuda_callable__ ( int i, int j ) mutable {
      const int elementIdx = i * gridSize + j;
      auto row = matrixView.getRow( elementIdx );
      if( i == 0 || j == 0 || i == gridSize - 1 || j == gridSize - 1 )
         row.setElement( 0, 1.0 );
      else
      {
         row.setElement( 0, -1.0 );
         row.setElement( 1, -1.0 );
         row.setElement( 2,  4.0 );
         row.setElement( 3, -1.0 );
         row.setElement( 4, -1.0 );
      }
   };
   TNL::Algorithms::ParallelFor2D< Device >::exec( 0, 0, gridSize, gridSize, f );

   std::cout << "Laplace operator matrix: " << std::endl << matrix << std::endl;
}

int main( int argc, char* argv[] )
{
   std::cout << "Creating Laplace operator matrix on CPU ... " << std::endl;
   laplaceOperatorMatrix< TNL::Devices::Host >();

#ifdef HAVE_CUDA
   std::cout << "Creating Laplace operator matrix on CUDA GPU ... " << std::endl;
   laplaceOperatorMatrix< TNL::Devices::Cuda >();
#endif
}
Loading