Newer
Older
/***************************************************************************
tnlFunctionAdapter.h - description
-------------------
begin : Nov 28, 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 TNLFUNCTIONADAPTER_H_
#define TNLFUNCTIONADAPTER_H_
#include <functions/tnlConstantFunction.h>
typename Function,
int FunctionType = tnlFunctionType< Function >::Type >
{
};
/****
* General implementation:
* - it passes both mesh entity center and mesh entity index
*/
template< typename Mesh,
typename Function >
class tnlFunctionAdapter< Mesh, Function, tnlGeneralFunction >
{
public:
typedef Mesh MeshType;
typedef Function FunctionType;
typedef typename FunctionType::RealType RealType;
typedef typename MeshType::IndexType IndexType;
template< int MeshEntityDimension >
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const RealType& time = 0.0 )
{
return function.getValue( mesh.template getEntityCenter< MeshEntityDimension >,
* General implementation with specialization for grid functions
* - it takes grid coordinates for faster entity center evaluation
template< int Dimensions,
typename Real,
typename Device,
typename Index,
typename Function >
class tnlFunctionAdapter< tnlGrid< Dimensions, Real, Device, Index >, Function, tnlGeneralFunction >
{
public:
typedef tnlGrid< Dimensions, Real, Device, Index > MeshType;
typedef Function FunctionType;
typedef Real RealType;
typedef Index IndexType;
typedef typename MeshType::VertexType VertexType;
typedef typename MeshType::CoordinatesType CoordinatesType;
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const CoordinatesType& coordinates,
const RealType& time = 0.0 )
{
return function.getValue( mesh.template getCellCenter< VertexType >( coordinates ),
index,
time );
}
};
/****
* Specialization for discrete functions:
* - it passes only the mesh entity index
*/
typename Function >
class tnlFunctionAdapter< Mesh, Function, tnlDiscreteFunction >
{
public:
typedef Mesh MeshType;
typedef typename FunctionType::RealType RealType;
typedef typename MeshType::IndexType IndexType;
template< int MeshEntityDimension >
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const RealType& time = 0.0 )
return function.getValue( index,
time );
* Specialization for analytic functions:
* - it does not pass the mesh entity index
class tnlFunctionAdapter< Mesh, Function, tnlAnalyticFunction >
typedef typename FunctionType::RealType RealType;
typedef typename MeshType::IndexType IndexType;
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const RealType& time = 0.0 )
return function.getValue( mesh.template getEntityCenter< MeshEntityDimension >,
* Specialization for analytic grid functions:
* - it does not pass the mesh entity index
*/
template< int Dimensions,
typename Real,
typename Device,
typename Index,
typename Function >
class tnlFunctionAdapter< tnlGrid< Dimensions, Real, Device, Index >, Function, tnlAnalyticFunction >
typedef tnlGrid< Dimensions, Real, Device, Index > MeshType;
typedef Real RealType;
typedef Index IndexType;
typedef typename MeshType::VertexType VertexType;
typedef typename MeshType::CoordinatesType CoordinatesType;
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const CoordinatesType& coordinates,
const RealType& time = 0.0 )
return function.getValue( mesh.template getCellCenter< VertexType >( coordinates ),
time );
* Specialization for constant function
* - it does not ask the mesh for the mesh entity center
int FunctionDimensions,
typename Real >
class tnlFunctionAdapter< Mesh, tnlConstantFunction< FunctionDimensions, Real >, tnlAnalyticFunction >
typedef tnlConstantFunction< FunctionDimensions, Real > FunctionType;
typedef typename FunctionType::RealType RealType;
typedef typename MeshType::IndexType IndexType;
typedef typename MeshType::VertexType VertexType;
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const RealType& time = 0.0 )
VertexType v;
return function.getValue( v, time );
* Specialization for grids and constant function
* - it takes grid coordinates for faster entity center evaluation
*/
template< int Dimensions,
typename Real,
typename Device,
typename Index >
class tnlFunctionAdapter< tnlGrid< Dimensions, Real, Device, Index >,
tnlConstantFunction< Dimensions, Real >,
tnlAnalyticFunction >
typedef tnlGrid< Dimensions, Real, Device, Index > MeshType;
typedef tnlConstantFunction< Dimensions, Real > FunctionType;
typedef Real RealType;
typedef Index IndexType;
typedef typename MeshType::VertexType VertexType;
typedef typename MeshType::CoordinatesType CoordinatesType;
#ifdef HAVE_CUDA
__device__ __host__
#endif
static RealType getValue( const MeshType& mesh,
const FunctionType& function,
const IndexType index,
const CoordinatesType& coordinates,
const RealType& time = 0.0 )
VertexType v;
return function.getValue( v, time );
}
};
#endif /* TNLFUNCTIONADAPTER_H_ */