Skip to content
Snippets Groups Projects
tnlLinearDiffusion_impl.h 6.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • #ifndef TNLLINEARDIFFUSION_IMP_H
    #define	TNLLINEARDIFFUSION_IMP_H
    
    #include <operators/diffusion/tnlLinearDiffusion.h>
    
    #include <mesh/tnlGrid.h>
    
    template< typename MeshReal,
              typename Device,
              typename MeshIndex,
              typename Real,
              typename Index >
    tnlString
    tnlLinearDiffusion< tnlGrid< 1, MeshReal, Device, MeshIndex >, Real, Index >::
    getType()
    {
       return tnlString( "tnlLinearDiffusion< " ) +
              MeshType::getType() + ", " +
              ::getType< Real >() + ", " +
              ::getType< Index >() + " >";
    }
    
    
    template< typename MeshReal,
    
              typename Device,
    
              typename MeshIndex,
              typename Real,
              typename Index >
       template< typename Vector >
    
    #ifdef HAVE_CUDA
    __device__ __host__
    #endif
    
    void
    tnlLinearDiffusion< tnlGrid< 1, MeshReal, Device, MeshIndex >, Real, Index >::
    explicitUpdate( const RealType& time,
                    const RealType& tau,
                    const MeshType& mesh,
                    const IndexType cellIndex,
                    const CoordinatesType& coordinates,
                    Vector& u,
    
                    Vector& fu ) const
    
       fu[ cellIndex ] = ( u[ mesh.getCellXPredecessor( cellIndex ) ]
                           - 2.0 * u[ cellIndex ]
                           + u[ mesh.getCellXSuccessor( cellIndex ) ] ) * mesh.getHxSquareInverse();
    
    template< typename MeshReal,
              typename Device,
              typename MeshIndex,
              typename Real,
              typename Index >
    template< typename Vector >
    #ifdef HAVE_CUDA
    __device__ __host__
    #endif
    Real
    tnlLinearDiffusion< tnlGrid< 1, MeshReal, Device, MeshIndex >, Real, Index >::
    getValue( const MeshType& mesh,
              const IndexType cellIndex,
              Vector& u ) const
    {
       return ( u[ mesh.getCellXPredecessor( cellIndex ) ]
                - 2.0 * u[ cellIndex ]
                + u[ mesh.getCellXSuccessor( cellIndex ) ] ) * mesh.getHxSquareInverse();
    }
    
    template< typename MeshReal,
              typename Device,
              typename MeshIndex,
              typename Real,
              typename Index >
    tnlString
    tnlLinearDiffusion< tnlGrid< 2, MeshReal, Device, MeshIndex >, Real, Index >::
    getType()
    {
       return tnlString( "tnlLinearDiffusion< " ) +
              MeshType::getType() + ", " +
              ::getType< Real >() + ", " +
              ::getType< Index >() + " >";
    }
    
    
    template< typename MeshReal,
    
              typename Device,
    
              typename MeshIndex,
              typename Real,
              typename Index >
    
       template< typename Vector >
    
    #ifdef HAVE_CUDA
    __device__ __host__
    #endif
    
    void
    tnlLinearDiffusion< tnlGrid< 2, MeshReal, Device, MeshIndex >, Real, Index >::
    explicitUpdate( const RealType& time,
                    const RealType& tau,
                    const MeshType& mesh,
                    const IndexType cellIndex,
                    const CoordinatesType& coordinates,
                    Vector& u,
    
                    Vector& fu ) const
    
       fu[ cellIndex ] = ( u[ mesh.getCellXPredecessor( cellIndex ) ]
                           - 2.0 * u[ cellIndex ]
                           + u[ mesh.getCellXSuccessor( cellIndex ) ] ) * mesh.getHxSquareInverse() +
                         ( u[ mesh.getCellYPredecessor( cellIndex ) ]
                           - 2.0 * u[ cellIndex ]
                           + u[ mesh.getCellYSuccessor( cellIndex ) ] ) * mesh.getHySquareInverse();
    
    template< typename MeshReal,
              typename Device,
              typename MeshIndex,
              typename Real,
              typename Index >
    template< typename Vector >
    #ifdef HAVE_CUDA
    __device__ __host__
    #endif
    Real
    tnlLinearDiffusion< tnlGrid< 2, MeshReal, Device, MeshIndex >, Real, Index >::
    getValue( const MeshType& mesh,
              const IndexType cellIndex,
              Vector& u ) const
    {
       return ( u[ mesh.getCellXPredecessor( cellIndex ) ]
                - 2.0 * u[ cellIndex ]
                + u[ mesh.getCellXSuccessor( cellIndex ) ] ) * mesh.getHxSquareInverse() +
               ( u[ mesh.getCellYPredecessor( cellIndex ) ]
                 - 2.0 * u[ cellIndex ]
                 + u[ mesh.getCellYSuccessor( cellIndex ) ] ) * mesh.getHySquareInverse();
    }
    
    template< typename MeshReal,
              typename Device,
              typename MeshIndex,
              typename Real,
              typename Index >
    tnlString
    tnlLinearDiffusion< tnlGrid< 3, MeshReal, Device, MeshIndex >, Real, Index >::
    getType()
    {
       return tnlString( "tnlLinearDiffusion< " ) +
              MeshType::getType() + ", " +
              ::getType< Real >() + ", " +
              ::getType< Index >() + " >";
    }
    
    
    template< typename MeshReal,
    
              typename Device,
    
              typename MeshIndex,
              typename Real,
              typename Index >
    
       template< typename Vector >
    
    #ifdef HAVE_CUDA
    __device__ __host__
    #endif
    
    void
    tnlLinearDiffusion< tnlGrid< 3, MeshReal, Device, MeshIndex >, Real, Index >::
    explicitUpdate( const RealType& time,
                    const RealType& tau,
                    const MeshType& mesh,
                    const IndexType cellIndex,
                    const CoordinatesType& coordinates,
                    Vector& u,
    
                    Vector& fu ) const
    
       fu[ cellIndex ] = ( u[ mesh.getCellXPredecessor( cellIndex ) ]
                           - 2.0 * u[ cellIndex ]
                           + u[ mesh.getCellXSuccessor( cellIndex ) ] ) * mesh.getHxSquareInverse() +
                         ( u[ mesh.getCellYPredecessor( cellIndex ) ]
                           - 2.0 * u[ cellIndex ]
                           + u[ mesh.getCellYSuccessor( cellIndex ) ] ) * mesh.getHySquareInverse() +
                         ( u[ mesh.getCellZPredecessor( cellIndex ) ]
                           - 2.0 * u[ cellIndex ]
                           + u[ mesh.getCellZSuccessor( cellIndex ) ] ) * mesh.getHzSquareInverse();
    
    template< typename MeshReal,
              typename Device,
              typename MeshIndex,
              typename Real,
              typename Index >
    template< typename Vector >
    #ifdef HAVE_CUDA
    __device__ __host__
    #endif
    Real
    tnlLinearDiffusion< tnlGrid< 3, MeshReal, Device, MeshIndex >, Real, Index >::
    getValue( const MeshType& mesh,
              const IndexType cellIndex,
              Vector& u ) const
    {
       return ( u[ mesh.getCellXPredecessor( cellIndex ) ]
                - 2.0 * u[ cellIndex ]
                + u[ mesh.getCellXSuccessor( cellIndex ) ] ) * mesh.getHxSquareInverse() +
              ( u[ mesh.getCellYPredecessor( cellIndex ) ]
                - 2.0 * u[ cellIndex ]
                + u[ mesh.getCellYSuccessor( cellIndex ) ] ) * mesh.getHySquareInverse() +
              ( u[ mesh.getCellZPredecessor( cellIndex ) ]
                - 2.0 * u[ cellIndex ]
                + u[ mesh.getCellZSuccessor( cellIndex ) ] ) * mesh.getHzSquareInverse();
    }
    
    
    #endif	/* TNLLINEARDIFFUSION_IMP_H */