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>
template< typename Real,
Tomáš Oberhuber
committed
typename MeshFunction,
typename DifferentialOperator,
typename BoundaryConditions,
class tnlExplicitUpdaterTraverserUserData
const DifferentialOperator* differentialOperator;
const BoundaryConditions* boundaryConditions;
const RightHandSide* rightHandSide;
Tomáš Oberhuber
committed
MeshFunction *u, *fu;
tnlExplicitUpdaterTraverserUserData( const Real& time,
const DifferentialOperator& differentialOperator,
const BoundaryConditions& boundaryConditions,
const RightHandSide& rightHandSide,
Tomáš Oberhuber
committed
MeshFunction& u,
MeshFunction& fu )
: time( &time ),
differentialOperator( &differentialOperator ),
boundaryConditions( &boundaryConditions ),
rightHandSide( &rightHandSide ),
u( &u ),
fu( &fu )
template< typename Mesh,
Tomáš Oberhuber
committed
typename MeshFunction,
typename DifferentialOperator,
typename BoundaryConditions,
class tnlExplicitUpdater
{
public:
typedef Mesh MeshType;
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,
tnlExplicitUpdater()
: gpuTransferTimer( 0 ){}
void setGPUTransferTimer( tnlTimer& timer )
{
this->gpuTransferTimer = &timer;
}
void update( const RealType& time,
const MeshType& mesh,
const DifferentialOperator& differentialOperator,
const BoundaryConditions& boundaryConditions,
const RightHandSide& rightHandSide,
Tomáš Oberhuber
committed
MeshFunction& u,
MeshFunction& fu ) const;
class TraverserBoundaryEntitiesProcessor
static inline void processEntity( const MeshType& mesh,
TraverserUserData& userData,
const GridEntity& entity )
( *userData.u )( entity ) = userData.boundaryConditions->operator()
( *userData.u,
entity,
class TraverserInteriorEntitiesProcessor
{
public:
typedef typename MeshType::VertexType VertexType;
static inline void processEntity( const MeshType& mesh,
TraverserUserData& userData,
const EntityType& entity )
Tomáš Oberhuber
committed
( *userData.fu)( entity ) =
userData.differentialOperator->operator()(
typedef tnlFunctionAdapter< MeshType, RightHandSide > FunctionAdapter;
Tomáš Oberhuber
committed
( * userData.fu )( entity ) +=
FunctionAdapter::getValue(
*userData.rightHandSide,
entity,
protected:
tnlTimer* gpuTransferTimer;
#include <solvers/pde/tnlExplicitUpdater_impl.h>
#endif /* TNLEXPLICITUPDATER_H_ */