Newer
Older
/***************************************************************************
tnl-view.h - description
-------------------
begin : Jan 21, 2013
copyright : (C) 2013 by Tomas Oberhuber
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
#ifndef TNL_VIEW_H_
#define TNL_VIEW_H_
#include <TNL/FileName.h>
#include <TNL/Config/ParameterContainer.h>
#include <TNL/String.h>
#include <TNL/Containers/Vector.h>
#include <TNL/Containers/MultiVector.h>
bool getOutputFileName( const String& inputFileName,
const String& outputFormat,
String& outputFileName )
{
outputFileName = inputFileName;
removeFileExtension( outputFileName );
if( outputFormat == "gnuplot" )
{
outputFileName += ".gplt";
return true;
}
std::cerr << "Unknown file format " << outputFormat << ".";
template< typename MeshFunction >
bool writeMeshFunction( const typename MeshFunction::MeshPointer& meshPointer,
const String& inputFileName,
const Config::ParameterContainer& parameters )
MeshFunction function( meshPointer );
std::cout << "Mesh function: " << function.getType() << std::endl;
if( ! function.load( inputFileName ) )
{
std::cerr << "Unable to load mesh function from a file " << inputFileName << "." << std::endl;
return false;
}
int verbose = parameters. getParameter< int >( "verbose");
String outputFormat = parameters. getParameter< String >( "output-format" );
String outputFileName;
if( ! getOutputFileName( inputFileName,
outputFormat,
outputFileName ) )
return false;
if( verbose )
std::cout << " writing to " << outputFileName << " ... " << std::flush;
return function.write( outputFileName, outputFormat );
}
template< typename MeshPointer,
int EntityDimensions,
typename Real >
bool setMeshFunctionRealType( const MeshPointer& meshPointer,
const String& inputFileName,
const Config::ParameterContainer& parameters )
return writeMeshFunction< Functions::MeshFunction< typename MeshPointer::ObjectType, EntityDimensions, Real > >( meshPointer, inputFileName, parameters );
template< typename MeshPointer,
int EntityDimensions >
bool setMeshEntityType( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
{
if( parsedObjectType[ 3 ] == "float" )
return setMeshFunctionRealType< MeshPointer, EntityDimensions, float >( meshPointer, inputFileName, parameters );
if( parsedObjectType[ 3 ] == "double" )
return setMeshFunctionRealType< MeshPointer, EntityDimensions, double >( meshPointer, inputFileName, parameters );
if( parsedObjectType[ 3 ] == "long double" )
return setMeshFunctionRealType< MeshPointer, EntityDimensions, long double >( meshPointer, inputFileName, parameters );
std::cerr << "Unsupported arithmetics " << parsedObjectType[ 3 ] << " in mesh function " << inputFileName << std::endl;
return false;
}
template< typename MeshReal,
typename MeshIndex >
bool setMeshEntityDimensions( const SharedPointer< Meshes::Grid< 1, MeshReal, Devices::Host, MeshIndex > >& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
typedef Meshes::Grid< 1, MeshReal, Devices::Host, MeshIndex > Mesh;
typedef SharedPointer< Mesh > MeshPointer;
int meshEntityDimensions = atoi( parsedObjectType[ 2 ].getString() );
switch( meshEntityDimensions )
return setMeshEntityType< MeshPointer, 0 >( meshPointer, inputFileName, parsedObjectType, parameters );
return setMeshEntityType< MeshPointer, 1 >( meshPointer, inputFileName, parsedObjectType, parameters );
std::cerr << "Unsupported mesh functions entity dimensions count " << meshEntityDimensions << "." << std::endl;
}
template< typename MeshReal,
typename MeshIndex >
bool setMeshEntityDimensions( const SharedPointer< Meshes::Grid< 2, MeshReal, Devices::Host, MeshIndex > >& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
typedef Meshes::Grid< 2, MeshReal, Devices::Host, MeshIndex > Mesh;
typedef SharedPointer< Mesh > MeshPointer;
int meshEntityDimensions = atoi( parsedObjectType[ 2 ].getString() );
switch( meshEntityDimensions )
{
return setMeshEntityType< MeshPointer, 0 >( meshPointer, inputFileName, parsedObjectType, parameters );
return setMeshEntityType< MeshPointer, 1 >( meshPointer, inputFileName, parsedObjectType, parameters );
return setMeshEntityType< MeshPointer, 2 >( meshPointer, inputFileName, parsedObjectType, parameters );
std::cerr << "Unsupported mesh functions entity dimensions count " << meshEntityDimensions << "." << std::endl;
return false;
}
}
template< typename MeshReal,
typename MeshIndex >
bool setMeshEntityDimensions( const SharedPointer< Meshes::Grid< 3, MeshReal, Devices::Host, MeshIndex > >& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
typedef Meshes::Grid< 3, MeshReal, Devices::Host, MeshIndex > Mesh;
typedef SharedPointer< Mesh > MeshPointer;
int meshEntityDimensions = atoi( parsedObjectType[ 2 ].getString() );
switch( meshEntityDimensions )
{
return setMeshEntityType< MeshPointer, 0 >( meshPointer, inputFileName, parsedObjectType, parameters );
return setMeshEntityType< MeshPointer, 1 >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 2:
return setMeshEntityType< MeshPointer, 2 >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 3:
return setMeshEntityType< MeshPointer, 3 >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
default:
std::cerr << "Unsupported mesh functions entity dimensions count " << meshEntityDimensions << "." << std::endl;
return false;
}
}
template< typename MeshPointer >
bool setMeshFunction( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
if( parsedObjectType[ 1 ] != meshPointer->getSerializationType() )
std::cerr << "Incompatible mesh type for the mesh function " << inputFileName << "." << std::endl;
return setMeshEntityDimensions( meshPointer, inputFileName, parsedObjectType, parameters );
template< typename MeshPointer, typename Element, typename Real, typename Index, int Dimensions >
bool convertObject( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
int verbose = parameters. getParameter< int >( "verbose");
String outputFormat = parameters. getParameter< String >( "output-format" );
String outputFileName;
if( ! getOutputFileName( inputFileName,
outputFormat,
outputFileName ) )
return false;
std::cout << " writing to " << outputFileName << " ... " << std::flush;
if( parsedObjectType[ 0 ] == "Containers::Vector" ||
parsedObjectType[ 0 ] == "tnlSharedVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlVector" ) //
Containers::Vector< Element, Devices::Host, Index > vector;
if( ! vector. load( inputFileName ) )
return false;
using MeshType = typename MeshPointer::ObjectType;
Functions::MeshFunction< MeshType, MeshType::meshDimensions, Element > mf;
mf.bind( meshPointer, vector );
if( ! mf.write( outputFileName, outputFormat ) )
if( parsedObjectType[ 0 ] == "Containers::MultiVector" ||
parsedObjectType[ 0 ] == "tnlMultiVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlSharedMultiVector" ) //
Containers::MultiVector< Dimensions, Element, Devices::Host, Index > multiVector;
if( ! multiVector. load( inputFileName ) )
return false;
typedef Meshes::Grid< Dimensions, Real, Devices::Host, Index > GridType;
typedef typename GridType::VertexType VertexType;
typedef typename GridType::CoordinatesType CoordinatesType;
GridType grid;
grid. setDomain( VertexType( 0.0 ), VertexType( 1.0 ) );
grid. setDimensions( CoordinatesType( multiVector. getDimensions() ) );
if( ! grid. write( multiVector, outputFileName, outputFormat ) )
return false;
}
template< typename MeshPointer, typename Element, typename Real, typename Index >
bool setDimensions( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
if( parsedObjectType[ 0 ] == "Containers::MultiVector" ||
parsedObjectType[ 0 ] == "tnlMultiVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlSharedMultiVector" ) //
dimensions = atoi( parsedObjectType[ 1 ]. getString() );
if( parsedObjectType[ 0 ] == "Containers::Vector" ||
parsedObjectType[ 0 ] == "tnlVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlSharedVector" ) //
return convertObject< MeshPointer, Element, Real, Index, 1 >( meshPointer, inputFileName, parsedObjectType, parameters );
return convertObject< MeshPointer, Element, Real, Index, 2 >( meshPointer, inputFileName, parsedObjectType, parameters );
return convertObject< MeshPointer, Element, Real, Index, 3 >( meshPointer, inputFileName, parsedObjectType, parameters );
std::cerr << "Cannot convert objects with " << dimensions << " dimensions." << std::endl;
template< typename MeshPointer, typename Element, typename Real >
bool setIndexType( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
if( parsedObjectType[ 0 ] == "Containers::MultiVector" ||
parsedObjectType[ 0 ] == "tnlMultiVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlSharedMultiVector" ) //
if( parsedObjectType[ 0 ] == "Containers::Vector" ||
parsedObjectType[ 0 ] == "tnlSharedVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlVector" ) //
return setDimensions< MeshPointer, Element, Real, int >( meshPointer, inputFileName, parsedObjectType, parameters );
return setDimensions< MeshPointer, Element, Real, long int >( meshPointer, inputFileName, parsedObjectType, parameters );
std::cerr << "Unknown index type " << indexType << "." << std::endl;
template< typename MeshPointer >
bool setTupleType( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const List< String >& parsedElementType,
const Config::ParameterContainer& parameters )
{
int dimensions = atoi( parsedElementType[ 1 ].getString() );
String dataType = parsedElementType[ 2 ];
if( dataType == "float" )
switch( dimensions )
{
case 1:
return setIndexType< MeshPointer, Containers::StaticVector< 1, float >, float >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 2:
return setIndexType< MeshPointer, Containers::StaticVector< 2, float >, float >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 3:
return setIndexType< MeshPointer, Containers::StaticVector< 3, float >, float >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
}
if( dataType == "double" )
switch( dimensions )
{
case 1:
return setIndexType< MeshPointer, Containers::StaticVector< 1, double >, double >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 2:
return setIndexType< MeshPointer, Containers::StaticVector< 2, double >, double >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 3:
return setIndexType< MeshPointer, Containers::StaticVector< 3, double >, double >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
}
if( dataType == "long double" )
switch( dimensions )
{
case 1:
return setIndexType< MeshPointer, Containers::StaticVector< 1, long double >, long double >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 2:
return setIndexType< MeshPointer, Containers::StaticVector< 2, long double >, long double >( meshPointer, inputFileName, parsedObjectType, parameters );
break;
case 3:
return setIndexType< MeshPointer, Containers::StaticVector< 3, long double >, long double >( meshPointer, inputFileName, parsedObjectType, parameters );
template< typename MeshPointer >
bool setElementType( const MeshPointer& meshPointer,
const String& inputFileName,
const List< String >& parsedObjectType,
const Config::ParameterContainer& parameters )
String elementType;
if( parsedObjectType[ 0 ] == "Containers::MultiVector" ||
parsedObjectType[ 0 ] == "tnlMultiVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlSharedMultiVector" ) //
if( parsedObjectType[ 0 ] == "Containers::Vector" ||
parsedObjectType[ 0 ] == "tnlSharedVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlVector" ) //
return setIndexType< MeshPointer, float, float >( meshPointer, inputFileName, parsedObjectType, parameters );
return setIndexType< MeshPointer, double, double >( meshPointer, inputFileName, parsedObjectType, parameters );
if( elementType == "long double" )
return setIndexType< MeshPointer, long double, long double >( meshPointer, inputFileName, parsedObjectType, parameters );
List< String > parsedElementType;
if( ! parseObjectType( elementType, parsedElementType ) )
{
std::cerr << "Unable to parse object type " << elementType << "." << std::endl;
return false;
}
// FIXME: this does not compile for an unknown reason
// if( parsedElementType[ 0 ] == "Containers::StaticVector" ||
// parsedElementType[ 0 ] == "tnlStaticVector" ) // TODO: remove deprecated type names
// return setTupleType< MeshPointer >( meshPointer, inputFileName, parsedObjectType, parsedElementType, parameters );
std::cerr << "Unknown element type " << elementType << "." << std::endl;
return false;
}
template< typename Mesh >
bool processFiles( const Config::ParameterContainer& parameters )
int verbose = parameters. getParameter< int >( "verbose");
String meshFile = parameters. getParameter< String >( "mesh" );
typedef SharedPointer< Mesh > MeshPointer;
MeshPointer meshPointer;
if( ! meshPointer->load( meshFile ) )
std::cerr << "I am not able to load mesh from the file " << meshFile << "." << std::endl;
meshPointer->writeMesh( "mesh.asy", "asymptote" );
bool checkOutputFile = parameters. getParameter< bool >( "check-output-file" );
List< String > inputFiles = parameters. getParameter< List< String > >( "input-files" );
//#ifdef HAVE_OPENMP
//#pragma omp parallel for
//#endif
for( int i = 0; i < inputFiles. getSize(); i ++ )
{
if( verbose )
std::cout << "Processing file " << inputFiles[ i ] << " ... " << std::flush;
String outputFormat = parameters. getParameter< String >( "output-format" );
String outputFileName;
if( ! getOutputFileName( inputFiles[ i ],
outputFormat,
outputFileName ) )
{
error = true;
continue;
}
if( checkOutputFile && fileExists( outputFileName ) )
{
if( verbose )
std::cout << " file already exists. Skipping. \r" << std::flush;
continue;
}
if( ! getObjectType( inputFiles[ i ], objectType ) )
std::cerr << "unknown object ... SKIPPING!" << std::endl;
List< String > parsedObjectType;
if( ! parseObjectType( objectType, parsedObjectType ) )
std::cerr << "Unable to parse object type " << objectType << "." << std::endl;
if( parsedObjectType[ 0 ] == "Containers::MultiVector" ||
parsedObjectType[ 0 ] == "Containers::Vector" ||
parsedObjectType[ 0 ] == "tnlMultiVector" || // TODO: remove deprecated type names
parsedObjectType[ 0 ] == "tnlSharedMultiVector" || //
parsedObjectType[ 0 ] == "tnlSharedVector" || //
parsedObjectType[ 0 ] == "tnlVector" ) //
setElementType< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters );
if( parsedObjectType[ 0 ] == "Functions::MeshFunction" ||
parsedObjectType[ 0 ] == "tnlMeshFunction" ) // TODO: remove deprecated type names
setMeshFunction< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters );
#endif /* TNL_VIEW_H_ */