Newer
Older
/***************************************************************************
tnlMeshFunction_impl.h - description
-------------------
begin : Nov 8, 2015
copyright : (C) 2015 by 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. *
* *
***************************************************************************/
#include <core/tnlAssert.h>
#include <functions/tnlMeshFunction.h>
#include <functions/tnlFunctionEvaluator.h>
#include <functions/tnlMeshFunctionEvaluator.h>
#include <functions/tnlMeshFunctionNormGetter.h>
#include <functions/tnlMeshFunctionGnuplotWriter.h>
#include <functions/tnlMeshFunctionVTKWriter.h>
Tomáš Oberhuber
committed
#ifndef TNLMESHFUNCTION_IMPL_H
#define TNLMESHFUNCTION_IMPL_H
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
tnlMeshFunction()
: mesh( 0 )
{
}
Tomáš Oberhuber
committed
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
tnlMeshFunction( const Mesh& mesh )
: mesh( &mesh )
{
this->data.setSize( mesh.template getEntitiesCount< typename Mesh::template MeshEntity< MeshEntityDimensions > >() );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename Vector >
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
tnlMeshFunction( const MeshType& mesh,
Vector& data,
const IndexType& offset )
{
Tomáš Oberhuber
committed
this->bind( mesh, data, offset );
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
tnlString
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getType()
{
return tnlString( "tnlMeshFunction< " ) +
Mesh::getType() + ", " +
tnlString( MeshEntityDimensions ) + ", " +
::getType< Real >() +
" >";
};
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
tnlString
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getTypeVirtual() const
{
return this->getType();
};
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
tnlString
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getSerializationType()
{
return tnlString( "tnlMeshFunction< " ) +
Mesh::getSerializationType() + ", " +
tnlString( MeshEntityDimensions ) + ", " +
::getType< Real >() +
" >";
};
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
tnlString
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getSerializationTypeVirtual() const
{
return this->getSerializationType();
};
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
void
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
configSetup( tnlConfigDescription& config,
const tnlString& prefix )
{
config.addEntry< tnlString >( prefix + "file", "Dataset for the mesh function." );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
setup( const tnlParameterContainer& parameters,
const tnlString& prefix )
{
if( parameters.checkParameter( prefix + "file" ) )
{
tnlString fileName = parameters.getParameter< tnlString >( prefix + "file" );
if( ! this->data.load( fileName ) )
return false;
}
return true;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
void
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
bind( tnlMeshFunction< Mesh, MeshEntityDimensions, Real >& meshFunction )
{
this->data.bind( meshFunction.getData() );
}
Tomáš Oberhuber
committed
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename Vector >
Tomáš Oberhuber
committed
void
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
bind( const MeshType& mesh,
Tomáš Oberhuber
committed
const Vector& data,
const IndexType& offset )
{
this->mesh = &mesh;
Tomáš Oberhuber
committed
this->data.bind( data, offset, mesh.template getEntitiesCount< typename Mesh::template MeshEntity< MeshEntityDimensions > >() );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
void
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
{
this->mesh = &mesh;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
const typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::MeshType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getMesh() const
{
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
const typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::VectorType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getData() const
{
return this->data;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::VectorType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getData()
{
return this->data;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
refresh( const RealType& time ) const
{
return true;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
deepRefresh( const RealType& time ) const
{
return true;
}
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename EntityType >
typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::RealType
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getValue( const EntityType& meshEntity ) const
{
static_assert( EntityType::entityDimensions == MeshEntityDimensions, "Calling with wrong EntityType -- entity dimensions do not match." );
return this->data.getValue( meshEntity.getIndex() );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename EntityType >
void
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
setValue( const EntityType& meshEntity,
const RealType& value )
{
static_assert( EntityType::entityDimensions == MeshEntityDimensions, "Calling with wrong EntityType -- entity dimensions do not match." );
this->data.setValue( meshEntity.getIndex(), value );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename EntityType >
typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::RealType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator()( const EntityType& meshEntity,
const RealType& time )
{
static_assert( EntityType::entityDimensions == MeshEntityDimensions, "Calling with wrong EntityType -- entity dimensions do not match." );
return this->data[ meshEntity.getIndex() ];
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename EntityType >
const typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::RealType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator()( const EntityType& meshEntity,
const RealType& time ) const
{
static_assert( EntityType::entityDimensions == MeshEntityDimensions, "Calling with wrong EntityType -- entity dimensions do not match." );
return this->data[ meshEntity.getIndex() ];
}
Tomáš Oberhuber
committed
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
__cuda_callable__
typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::RealType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator[]( const IndexType& meshEntityIndex )
{
return this->data[ meshEntityIndex ];
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
__cuda_callable__
const typename tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::RealType&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator[]( const IndexType& meshEntityIndex ) const
{
return this->data[ meshEntityIndex ];
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename Function >
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator = ( const Function& f )
{
tnlMeshFunctionEvaluator< ThisType, Function >::evaluate( *this, f );
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename Function >
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator += ( const Function& f )
{
tnlMeshFunctionEvaluator< ThisType, Function >::evaluate( *this, f, 1.0, 1.0 );
return *this;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
template< typename Function >
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >&
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
operator -= ( const Function& f )
{
tnlMeshFunctionEvaluator< ThisType, Function >::evaluate( *this, f, 1.0, -1.0 );
return *this;
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
Real
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
getLpNorm( const RealType& p ) const
{
return tnlMeshFunctionNormGetter< ThisType >::getNorm( *this, p );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
Real
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
Tomáš Oberhuber
committed
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
save( tnlFile& file ) const
{
if( ! tnlObject::save( file ) )
return false;
Tomáš Oberhuber
committed
return this->data.save( file );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
load( tnlFile& file )
{
if( ! tnlObject::load( file ) )
return false;
Tomáš Oberhuber
committed
return this->data.load( file );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
boundLoad( tnlFile& file )
{
if( ! tnlObject::load( file ) )
return false;
return this->data.boundLoad( file );
}
template< typename Mesh,
int MeshEntityDimensions,
typename Real >
bool
tnlMeshFunction< Mesh, MeshEntityDimensions, Real >::
write( const tnlString& fileName,
const tnlString& format ) const
{
std::fstream file;
file.open( fileName.getString(), std::ios::out );
if( ! file )
{
std::cerr << "Unbable to open a file " << fileName << "." << std::endl;
return false;
}
return tnlMeshFunctionVTKWriter< ThisType >::write( *this, file );
return tnlMeshFunctionGnuplotWriter< ThisType >::write( *this, file );