Newer
Older
/***************************************************************************
-------------------
begin : Nov 8, 2015
copyright : (C) 2015 by oberhuber
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
#include <TNL/Object.h>
#include <TNL/Functions/Domain.h>
#include <TNL/Functions/MeshFunctionGnuplotWriter.h>
#include <TNL/Functions/MeshFunctionVTKWriter.h>
#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h>
#include <TNL/Meshes/DistributedMeshes/DistributedMeshSynchronizer.h>
int MeshEntityDimension = Mesh::getMeshDimension(),
public Domain< Mesh::getMeshDimension(), MeshDomain >
{
//static_assert( Mesh::DeviceType::DeviceType == Vector::DeviceType::DeviceType,
// "Both mesh and vector of a mesh function must reside on the same device.");
public:
using MeshType = Mesh;
using DeviceType = typename MeshType::DeviceType;
using IndexType = typename MeshType::GlobalIndexType;
using MeshPointer = SharedPointer< MeshType >;
using RealType = Real;
using VectorType = Containers::Vector< RealType, DeviceType, IndexType >;
using ThisType = Functions::MeshFunction< MeshType, MeshEntityDimension, RealType >;
using DistributedMeshType = Meshes::DistributedMeshes::DistributedMesh<MeshType>;
using DistributedMeshSynchronizerType = Meshes::DistributedMeshes::DistributedMeshSynchronizer<ThisType>;
static constexpr int getEntitiesDimension() { return MeshEntityDimension; }
static constexpr int getMeshDimension() { return MeshType::getMeshDimension(); }
Tomáš Oberhuber
committed
Vector& data,
const IndexType& offset = 0 );
template< typename Vector >
MeshFunction( const MeshPointer& meshPointer,
SharedPointer< Vector >& data,
const IndexType& offset = 0 );
static String getType();
String getTypeVirtual() const;
static String getSerializationType();
virtual String getSerializationTypeVirtual() const;
static void configSetup( Config::ConfigDescription& config,
const String& prefix = "" );
bool setup( const MeshPointer& meshPointer,
const Config::ParameterContainer& parameters,
const String& prefix = "" );
Tomáš Oberhuber
committed
template< typename Vector >
void bind( const MeshPointer& meshPointer,
Tomáš Oberhuber
committed
const Vector& data,
const IndexType& offset = 0 );
template< typename Vector >
void bind( const MeshPointer& meshPointer,
const SharedPointer< Vector >& dataPtr,
const IndexType& offset = 0 );
void setMesh( const MeshPointer& meshPointer );
template< typename Device = Devices::Host >
const MeshType& getMesh() const;
const MeshPointer& getMeshPointer() const;
static IndexType getDofs( const MeshPointer& meshPointer );
__cuda_callable__ const VectorType& getData() const;
__cuda_callable__ VectorType& getData();
bool refresh( const RealType& time = 0.0 ) const;
bool deepRefresh( const RealType& time = 0.0 ) const;
template< typename EntityType >
RealType getValue( const EntityType& meshEntity ) const;
template< typename EntityType >
void setValue( const EntityType& meshEntity,
const RealType& value );
RealType& operator()( const EntityType& meshEntity,
const RealType& time = 0.0 );
const RealType& operator()( const EntityType& meshEntity,
const RealType& time = 0.0 ) const;
Tomáš Oberhuber
committed
__cuda_callable__
RealType& operator[]( const IndexType& meshEntityIndex );
Tomáš Oberhuber
committed
__cuda_callable__
const RealType& operator[]( const IndexType& meshEntityIndex ) const;
template< typename Function >
ThisType& operator = ( const Function& f );
template< typename Function >
ThisType& operator -= ( const Function& f );
template< typename Function >
ThisType& operator += ( const Function& f );
RealType getLpNorm( const RealType& p ) const;
bool save( File& file ) const;
Tomáš Oberhuber
committed
bool load( File& file );
bool boundLoad( File& file );
bool write( const String& fileName,
const String& format = "vtk",
const double& scale = 1.0 ) const;
using Object::save;
using Object::load;
using Object::boundLoad;

Vít Hanousek
committed
void synchronize( bool withPeriodicBoundaryConditions = false );

Vít Hanousek
committed
//DistributedMeshSynchronizerType synchronizer;
Meshes::DistributedMeshes::DistributedMeshSynchronizer< Functions::MeshFunction< MeshType, MeshEntityDimension, RealType > > synchronizer;
template< typename, typename > friend class MeshFunctionEvaluator;

Vít Hanousek
committed
private:
void setupSynchronizer( DistributedMeshType *distributedMesh );