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/Assert.h>
#include <TNL/DevicePointer.h>
#include <TNL/Functions/MeshFunction.h>
#include <TNL/Functions/MeshFunctionEvaluator.h>
#include <TNL/Functions/MeshFunctionNormGetter.h>
#include <TNL/Functions/MeshFunctionGnuplotWriter.h>
#include <TNL/Functions/MeshFunctionVTKWriter.h>
Tomáš Oberhuber
committed
MeshFunction< Mesh, MeshEntityDimension, Real >::
Tomáš Oberhuber
committed
template< typename Mesh,
Tomáš Oberhuber
committed
typename Real >
MeshFunction< Mesh, MeshEntityDimension, Real >::
Tomáš Oberhuber
committed
{

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshPointer->GetDistGrid());
#endif
this->meshPointer=meshPointer;
this->data.setSize( getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() );
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
}
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshFunction.meshPointer->GetDistGrid());
#endif
this->meshPointer=meshFunction.meshPointer;
this->data.bind( meshFunction.getData() );
}
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
MeshFunction( const MeshPointer& meshPointer,
Vector& data,
const IndexType& offset )

Vít Hanousek
committed
//: meshPointer( meshPointer )

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshPointer->GetDistGrid());
#endif
this->meshPointer=meshPointer;
this->data.bind( data, offset, getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() );
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
Tomáš Oberhuber
committed
}
typename Real >
template< typename Vector >
MeshFunction< Mesh, MeshEntityDimension, Real >::
SharedPointer< Vector >& data,
const IndexType& offset )

Vít Hanousek
committed
//: meshPointer( meshPointer )

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshPointer->GetDistGrid());
#endif
this->meshPointer=meshPointer;
this->data.bind( *data, offset, getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() );
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
return String( "Functions::MeshFunction< " ) +
Mesh::getType() + ", " +
String( MeshEntityDimension ) + ", " +
" >";
};
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
getTypeVirtual() const
{
return this->getType();
};
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
getSerializationType()
{
Mesh::getSerializationType() + ", " +
String( MeshEntityDimension ) + ", " +
" >";
};
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
getSerializationTypeVirtual() const
{
return this->getSerializationType();
};
MeshFunction< Mesh, MeshEntityDimension, Real >::
configSetup( Config::ConfigDescription& config,
const String& prefix )
config.addEntry< String >( prefix + "file", "Dataset for the mesh function." );
MeshFunction< Mesh, MeshEntityDimension, Real >::
setup( const MeshPointer& meshPointer,
const Config::ParameterContainer& parameters,
const String& prefix )
this->setMesh( meshPointer );
if( parameters.checkParameter( prefix + "file" ) )
{
String fileName = parameters.getParameter< String >( prefix + "file" );
if( ! this->load( fileName ) )
else
{
std::cerr << "Missing parameter " << prefix << "file." << std::endl;
return false;
}
MeshFunction< Mesh, MeshEntityDimension, Real >::

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshFunction.meshPointer->GetDistGrid());
#endif
this->meshPointer=meshFunction.meshPointer;
this->data.bind( meshFunction.getData() );
}
Tomáš Oberhuber
committed
template< typename Mesh,
typename Real >
template< typename Vector >
Tomáš Oberhuber
committed
void
MeshFunction< Mesh, MeshEntityDimension, Real >::
bind( const MeshPointer& meshPointer,
Tomáš Oberhuber
committed
const Vector& data,

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshPointer->GetDistGrid());
#endif
this->meshPointer=meshPointer;
this->data.bind( data, offset, getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() );
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
Tomáš Oberhuber
committed
}
typename Real >
template< typename Vector >
void
MeshFunction< Mesh, MeshEntityDimension, Real >::
bind( const MeshPointer& meshPointer,
const SharedPointer< Vector >& data,

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshPointer->GetDistGrid());
#endif
this->meshPointer=meshPointer;
this->data.bind( *data, offset, getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() );
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
MeshFunction< Mesh, MeshEntityDimension, Real >::
setMesh( const MeshPointer& meshPointer )

Vít Hanousek
committed
#ifdef USE_MPI
SetupSynchronizer(meshPointer->GetDistGrid());
#endif
this->meshPointer=meshPointer;
this->data.setSize( getMesh().template getEntitiesCount< typename Mesh::template EntityType< MeshEntityDimension > >() );
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
template< typename Device >
__cuda_callable__
const typename MeshFunction< Mesh, MeshEntityDimension, Real >::MeshType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
return this->meshPointer.template getData< Device >();
}
template< typename Mesh,
const typename MeshFunction< Mesh, MeshEntityDimension, Real >::MeshPointer&
MeshFunction< Mesh, MeshEntityDimension, Real >::
getMeshPointer() const
{
return this->meshPointer;
template< typename Mesh,
typename Real >
typename MeshFunction< Mesh, MeshEntityDimension, Real >::IndexType
MeshFunction< Mesh, MeshEntityDimension, Real >::
getDofs( const MeshPointer& meshPointer )
return meshPointer->template getEntitiesCount< getEntitiesDimension() >();
__cuda_callable__
const typename MeshFunction< Mesh, MeshEntityDimension, Real >::VectorType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
getData() const
{
return this->data;
}
template< typename Mesh,
__cuda_callable__
typename MeshFunction< Mesh, MeshEntityDimension, Real >::VectorType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
getData()
{
return this->data;
}
MeshFunction< Mesh, MeshEntityDimension, Real >::
refresh( const RealType& time ) const
return true;
}
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
deepRefresh( const RealType& time ) const
{
return true;
}
typename Functions::MeshFunction< Mesh, MeshEntityDimension, Real >::RealType
MeshFunction< Mesh, MeshEntityDimension, Real >::
getValue( const EntityType& meshEntity ) const
{
static_assert( EntityType::getEntityDimension() == MeshEntityDimension, "Calling with wrong EntityType -- entity dimensions do not match." );
return this->data.getElement( meshEntity.getIndex() );
typename Real >
template< typename EntityType >
MeshFunction< Mesh, MeshEntityDimension, Real >::
setValue( const EntityType& meshEntity,
const RealType& value )
{
static_assert( EntityType::getEntityDimension() == MeshEntityDimension, "Calling with wrong EntityType -- entity dimensions do not match." );
this->data.setElement( meshEntity.getIndex(), value );
typename Real >
template< typename EntityType >
typename Functions::MeshFunction< Mesh, MeshEntityDimension, Real >::RealType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
operator()( const EntityType& meshEntity,
const RealType& time )
static_assert( EntityType::getEntityDimension() == MeshEntityDimension, "Calling with wrong EntityType -- entity dimensions do not match." );
return this->data[ meshEntity.getIndex() ];
}
template< typename Mesh,
typename Real >
template< typename EntityType >
const typename Functions::MeshFunction< Mesh, MeshEntityDimension, Real >::RealType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
operator()( const EntityType& meshEntity,
const RealType& time ) const
static_assert( EntityType::getEntityDimension() == MeshEntityDimension, "Calling with wrong EntityType -- entity dimensions do not match." );
return this->data[ meshEntity.getIndex() ];
}
Tomáš Oberhuber
committed
template< typename Mesh,
Tomáš Oberhuber
committed
typename Real >
__cuda_callable__
typename Functions::MeshFunction< Mesh, MeshEntityDimension, Real >::RealType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
Tomáš Oberhuber
committed
operator[]( const IndexType& meshEntityIndex )
Tomáš Oberhuber
committed
return this->data[ meshEntityIndex ];
}
template< typename Mesh,
Tomáš Oberhuber
committed
typename Real >
__cuda_callable__
const typename Functions::MeshFunction< Mesh, MeshEntityDimension, Real >::RealType&
MeshFunction< Mesh, MeshEntityDimension, Real >::
Tomáš Oberhuber
committed
operator[]( const IndexType& meshEntityIndex ) const
{
return this->data[ meshEntityIndex ];
}
template< typename Mesh,
typename Real >
template< typename Function >
MeshFunction< Mesh, MeshEntityDimension, Real >&
MeshFunction< Mesh, MeshEntityDimension, Real >::
operator = ( const Function& f )
{
DevicePointer< ThisType > thisDevicePtr( *this );
DevicePointer< typename std::add_const< Function >::type > fDevicePtr( f );
MeshFunctionEvaluator< ThisType, Function >::evaluate( thisDevicePtr, fDevicePtr );
typename Real >
template< typename Function >
MeshFunction< Mesh, MeshEntityDimension, Real >&
MeshFunction< Mesh, MeshEntityDimension, Real >::
DevicePointer< ThisType > thisDevicePtr( *this );
DevicePointer< typename std::add_const< Function >::type > fDevicePtr( f );
MeshFunctionEvaluator< ThisType, Function >::evaluate( thisDevicePtr, fDevicePtr, 1.0, 1.0 );
return *this;
}
template< typename Mesh,
typename Real >
template< typename Function >
MeshFunction< Mesh, MeshEntityDimension, Real >&
MeshFunction< Mesh, MeshEntityDimension, Real >::
DevicePointer< ThisType > thisDevicePtr( *this );
DevicePointer< typename std::add_const< Function >::type > fDevicePtr( f );
MeshFunctionEvaluator< ThisType, Function >::evaluate( thisDevicePtr, fDevicePtr, 1.0, -1.0 );
return *this;
}
template< typename Mesh,
MeshFunction< Mesh, MeshEntityDimension, Real >::
return MeshFunctionNormGetter< ThisType >::getNorm( *this, p );
MeshFunction< Mesh, MeshEntityDimension, Real >::
Tomáš Oberhuber
committed
template< typename Mesh,
Tomáš Oberhuber
committed
bool
MeshFunction< Mesh, MeshEntityDimension, Real >::
save( File& file ) const
Tomáš Oberhuber
committed
{
TNL_ASSERT( this->data.getSize() == this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >(),
std::cerr << "this->data.getSize() = " << this->data.getSize() << std::endl
<< "this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() = " << this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >() );
if( ! Object::save( file ) )

Vít Hanousek
committed
return false;
Tomáš Oberhuber
committed
return this->data.save( file );
}
template< typename Mesh,
Tomáš Oberhuber
committed
typename Real >
bool
MeshFunction< Mesh, MeshEntityDimension, Real >::
Tomáš Oberhuber
committed
{
if( ! Object::load( file ) )

Vít Hanousek
committed
return false;
if( ! this->data.load( file ) )
return false;
const IndexType meshSize = this->getMesh().template getEntitiesCount< typename MeshType::template EntityType< MeshEntityDimension > >();
if( this->data.getSize() != meshSize )
std::cerr << "Size of the data loaded to the mesh function (" << this->data.getSize() << ") does not fit with the mesh size (" << meshSize << ")." << std::endl;
Tomáš Oberhuber
committed
}
template< typename Mesh,
typename Real >
bool
MeshFunction< Mesh, MeshEntityDimension, Real >::
boundLoad( File& file )
if( ! Object::load( file ) )
MeshFunction< Mesh, MeshEntityDimension, Real >::
write( const String& fileName,
const String& format,
const double& scale ) const
std::fstream file;
file.open( fileName.getString(), std::ios::out );
if( ! file )
std::cerr << "Unable to open a file " << fileName << "." << std::endl;
return MeshFunctionVTKWriter< ThisType >::write( *this, file, scale );
else if( format == "gnuplot" )
return MeshFunctionGnuplotWriter< ThisType >::write( *this, file, scale );
else {
std::cerr << "Unknown output format: " << format << std::endl;
return false;
}

Vít Hanousek
committed
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
#ifdef USE_MPI
template< typename Mesh,
int MeshEntityDimension,
typename Real >
void
MeshFunction< Mesh, MeshEntityDimension, Real >::
synchronize(void)
{
//když je synchronizer korektně natavený
auto distrgrid = this->getMesh().GetDistGrid();
if(distrgrid != NULL && distrgrid->isMPIUsed())
{
this->synchronizer.Synchronize(*this);
}
}
template< typename Mesh,
int MeshEntityDimension,
typename Real >
void
MeshFunction< Mesh, MeshEntityDimension, Real >::
SetupSynchronizer(Meshes::DistributedGrid<Mesh> *distrgrid)
{
if(distrgrid)//pokud síť kterou se snaží uživatel nastavit je distruibuovaná
{
if(this->getMesh().GetDistGrid()!=distrgrid)//pokud má nová síť jinou distribuovanou síť než předchozí
{
this->synchronizer.SetDistributedGrid(distrgrid);
}
}
}
#endif