Newer
Older
/***************************************************************************
tnl-view.h - description
-------------------
begin : Jan 21, 2013
copyright : (C) 2013 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 TNL_VIEW_H_
#define TNL_VIEW_H_
#include <core/tnlString.h>
#include <core/tnlVector.h>
template< typename Mesh, typename Element, typename Index, int Dimensions >
bool convertObject( const Mesh& mesh,
const tnlString& inputFileName,
const tnlList< tnlString >& parsedObjectType,
const tnlParameterContainer& parameters )
{
int verbose = parameters. GetParameter< int >( "verbose");
bool checkOutputFile = parameters. GetParameter< bool >( "check-output-file" );
tnlString outputFileName( inputFileName );
RemoveFileExtension( outputFileName );
tnlString outputFormat = parameters. GetParameter< tnlString >( "output-format" );
if( outputFormat == "gnuplot" )
outputFileName += ".gplt";
else
cerr << "Unknown file format " << outputFormat << ".";
if( checkOutputFile && fileExists( outputFileName ) )
{
if( verbose )
cout << " file already exists. Skipping. \r" << flush;
return true;
}
cout << " writing to " << outputFileName << " ... " << flush;
if( parsedObjectType[ 0 ] == "tnlSharedVector" ||
parsedObjectType[ 0 ] == "tnlVector" )
{
tnlVector< Element, tnlHost, Index > vector;
if( ! vector. load( inputFileName ) )
return false;
if( ! mesh. write( vector, outputFileName, outputFormat ) )
return false;
}
if( parsedObjectType[ 0 ] == "tnlMultiVector" ||
parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
{
tnlMultiVector< Dimensions, Element, tnlHost, Index > multiVector;
if( ! multiVector. load( inputFileName ) )
return false;
tnlGrid< Dimensions, Element, tnlHost, Index > grid;
grid. setDimensions( multiVector. getDimensions() );
grid. setOrigin( tnlTuple< Dimensions, Element >( 0.0 ) );
grid. setProportions( tnlTuple< Dimensions, Element >( 1.0 ) );
const Element spaceStep = grid. getParametricStep(). x();
grid. setParametricStep( tnlTuple< Dimensions, Element >( spaceStep ) );
if( ! grid. write( multiVector, outputFileName, outputFormat ) )
return false;
}
}
template< typename Mesh, typename Element, typename Index >
bool setDimensions( const Mesh& mesh,
const tnlString& inputFileName,
const tnlList< tnlString >& parsedObjectType,
const tnlParameterContainer& parameters )
{
int dimensions( 0 );
if( parsedObjectType[ 0 ] == "tnlMultiVector" ||
parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
dimensions = atoi( parsedObjectType[ 1 ]. getString() );
if( parsedObjectType[ 0 ] == "tnlVector" ||
parsedObjectType[ 0 ] == "tnlSharedVector" )
dimensions = 1;
switch( dimensions )
{
case 1:
return convertObject< Mesh, Element, Index, 1 >( mesh, inputFileName, parsedObjectType, parameters );
case 2:
return convertObject< Mesh, Element, Index, 2 >( mesh, inputFileName, parsedObjectType, parameters );
case 3:
return convertObject< Mesh, Element, Index, 3 >( mesh, inputFileName, parsedObjectType, parameters );
}
cerr << "Cannot convert objects with " << dimensions << " dimensions." << endl;
return false;
}
template< typename Mesh, typename Element >
bool setIndexType( const Mesh& mesh,
const tnlString& inputFileName,
const tnlList< tnlString >& parsedObjectType,
const tnlParameterContainer& parameters )
{
tnlString indexType;
if( parsedObjectType[ 0 ] == "tnlMultiVector" ||
parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
indexType = parsedObjectType[ 4 ];
if( parsedObjectType[ 0 ] == "tnlSharedVector" ||
parsedObjectType[ 0 ] == "tnlVector" )
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
if( indexType == "int" )
return setDimensions< Mesh, Element, int >( mesh, inputFileName, parsedObjectType, parameters );
if( indexType == "long-int" )
return setDimensions< Mesh, Element, long int >( mesh, inputFileName, parsedObjectType, parameters );
cerr << "Unknown index type " << indexType << "." << endl;
return false;
}
template< typename Mesh >
bool setElementType( const Mesh& mesh,
const tnlString& inputFileName,
const tnlList< tnlString >& parsedObjectType,
const tnlParameterContainer& parameters )
{
tnlString elementType;
if( parsedObjectType[ 0 ] == "tnlMultiVector" ||
parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
elementType = parsedObjectType[ 2 ];
if( parsedObjectType[ 0 ] == "tnlSharedVector" ||
parsedObjectType[ 0 ] == "tnlVector" )
elementType = parsedObjectType[ 1 ];
if( elementType == "float" )
return setIndexType< Mesh, float >( mesh, inputFileName, parsedObjectType, parameters );
if( elementType == "double" )
return setIndexType< Mesh, double >( mesh, inputFileName, parsedObjectType, parameters );
if( elementType == "long-double" )
return setIndexType< Mesh, long double >( mesh, inputFileName, parsedObjectType, parameters );
cerr << "Unknown element type " << elementType << "." << endl;
return false;
}
template< typename Mesh >
bool processFiles( const tnlParameterContainer& parameters )
{
int verbose = parameters. GetParameter< int >( "verbose");
tnlString meshFile = parameters. GetParameter< tnlString >( "mesh" );
Mesh mesh;
if( meshFile != "" )
if( ! mesh. load( meshFile ) )
{
cerr << "I am not able to load mesh from the file " << meshFile << "." << endl;
return false;
}
mesh. writeMesh( "mesh.asy", "asymptote" );
tnlList< tnlString > inputFiles = parameters. GetParameter< tnlList< tnlString > >( "input-files" );
#ifdef HAVE_OPENMP
#pragma omp parallel for
#endif
for( int i = 0; i < inputFiles. getSize(); i ++ )
{
if( verbose )
cout << "Processing file " << inputFiles[ i ] << " ... " << flush;
tnlString objectType;
if( ! getObjectType( inputFiles[ i ], objectType ) )
cerr << "unknown object ... SKIPPING!" << endl;
else
{
if( verbose )
cout << objectType << " detected ... ";
tnlList< tnlString > parsedObjectType;
if( ! parseObjectType( objectType, parsedObjectType ) )
cerr << "Unable to parse object type " << objectType << "." << endl;
return false;
setElementType< Mesh >( mesh, inputFiles[ i ], parsedObjectType, parameters );
#endif /* TNL_VIEW_H_ */