Newer
Older
/***************************************************************************
tnlExplicitUpdater.h - description
-------------------
begin : Jul 29, 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 TNLEXPLICITUPDATER_H_
#define TNLEXPLICITUPDATER_H_
#include <core/tnlTimer.h>
#include <core/tnlSharedPointer.h>
template< typename Real,
Tomáš Oberhuber
committed
typename MeshFunction,
typename DifferentialOperator,
typename BoundaryConditions,
class tnlExplicitUpdaterTraverserUserData
typedef typename DifferentialOperator::DeviceType DeviceType;
typedef tnlSharedPointer< DifferentialOperator, DeviceType > DifferentialOperatorPointer;
typedef tnlSharedPointer< BoundaryConditions, DeviceType > BoundaryConditionsPointer;
typedef tnlSharedPointer< RightHandSide, DeviceType > RightHandSidePointer;
typedef tnlSharedPointer< MeshFunction, DeviceType > MeshFunctionPointer;
const DifferentialOperatorPointer differentialOperator;
const BoundaryConditionsPointer boundaryConditions;
const RightHandSidePointer rightHandSide;
tnlExplicitUpdaterTraverserUserData( const Real& time,
const DifferentialOperatorPointer& differentialOperator,
const BoundaryConditionsPointer& boundaryConditions,
const RightHandSidePointer& rightHandSide,
MeshFunctionPointer& u,
MeshFunctionPointer& fu )
differentialOperator( differentialOperator ),
boundaryConditions( boundaryConditions ),
rightHandSide( rightHandSide ),
u( u ),
fu( fu )
/*DifferentialOperator& differentialOperator()
return this->differentialOperator; //* ( DifferentialOperator* ) data;
}
BoundaryConditions& boundaryConditions()
{
return this->boundaryConditions; //* ( BoundaryConditions* ) & data[ sizeof( DifferentialOperator ) ];
}
RightHandSide& rightHandSide()
{
return this->rightHandSide; //* ( RightHandSide* ) & data[ sizeof( DifferentialOperator ) +
// sizeof( BoundaryConditions ) ];
}
MeshFunction& u()
{
return this->u; //* ( MeshFunction* ) & data[ sizeof( DifferentialOperator ) +
// sizeof( BoundaryConditions ) +
// sizeof( RightHandSide )];
}
MeshFunction& fu()
{
return this->fu; //* ( MeshFunction* ) & data[ sizeof( DifferentialOperator ) +
// sizeof( BoundaryConditions ) +
// sizeof( RightHandSide ) +
// sizeof( MeshFunction ) ];
}*/
template< typename Mesh,
Tomáš Oberhuber
committed
typename MeshFunction,
typename DifferentialOperator,
typename BoundaryConditions,
class tnlExplicitUpdater
{
public:
typedef Mesh MeshType;
typedef tnlSharedPointer< MeshType > MeshPointer;
Tomáš Oberhuber
committed
typedef typename MeshFunction::RealType RealType;
typedef typename MeshFunction::DeviceType DeviceType;
typedef typename MeshFunction::IndexType IndexType;
typedef tnlExplicitUpdaterTraverserUserData< RealType,
Tomáš Oberhuber
committed
MeshFunction,
BoundaryConditions,
typedef tnlSharedPointer< DifferentialOperator, DeviceType > DifferentialOperatorPointer;
typedef tnlSharedPointer< BoundaryConditions, DeviceType > BoundaryConditionsPointer;
typedef tnlSharedPointer< RightHandSide, DeviceType > RightHandSidePointer;
typedef tnlSharedPointer< MeshFunction, DeviceType > MeshFunctionPointer;
tnlExplicitUpdater()
: gpuTransferTimer( 0 ){}
void setGPUTransferTimer( tnlTimer& timer )
{
this->gpuTransferTimer = &timer;
}
void update( const RealType& time,
const MeshPointer& meshPointer,
const DifferentialOperatorPointer& differentialOperatorPointer,
const BoundaryConditionsPointer& boundaryConditionsPointer,
const RightHandSidePointer& rightHandSidePointer,
MeshFunctionPointer& uPointer,
MeshFunctionPointer& fuPointer ) const;
class TraverserBoundaryEntitiesProcessor
static inline void processEntity( const MeshType& mesh,
TraverserUserData& userData,
const GridEntity& entity )
( userData.u.template modifyData< DeviceType >() )( entity ) = ( userData.boundaryConditions.template getData< DeviceType >() )
( userData.u.template getData< DeviceType >(),
class TraverserInteriorEntitiesProcessor
{
public:
typedef typename MeshType::VertexType VertexType;
static inline void processEntity( const MeshType& mesh,
TraverserUserData& userData,
const EntityType& entity )
( userData.fu.template modifyData< tnlCuda >() )( entity ) =
( userData.differentialOperator.template getData< DeviceType >() )(
userData.u.template getData< tnlCuda >(),
userData.time );
typedef tnlFunctionAdapter< MeshType, RightHandSide > FunctionAdapter;
( userData.fu.template modifyData< tnlCuda >() )( entity ) +=
userData.rightHandSide.template getData< DeviceType >(),
userData.time );
protected:
tnlTimer* gpuTransferTimer;
#include <solvers/pde/tnlExplicitUpdater_impl.h>
#endif /* TNLEXPLICITUPDATER_H_ */