Skip to content
Snippets Groups Projects
tnl-view.h 7.82 KiB
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_

Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
#include <cstdlib>
#include <core/mfilename.h>
#include <config/tnlParameterContainer.h>
#include <core/tnlString.h>
#include <core/tnlVector.h>
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
#include <core/tnlMultiVector.h>
#include <mesh/tnlGrid.h>
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
using namespace std;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
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" );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   tnlString outputFileName( inputFileName );
   RemoveFileExtension( outputFileName );
   tnlString outputFormat = parameters. GetParameter< tnlString >( "output-format" );
   if( outputFormat == "gnuplot" )
      outputFileName += ".gplt";
   else
      cerr << "Unknown file format " << outputFormat << ".";
      return false;
   }
   if( checkOutputFile && fileExists( outputFileName ) )
   {
      if( verbose )
         cout << " file already exists. Skipping.            \r" << flush;
      return true;
   }
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( verbose )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      cout << " writing to " << outputFileName << " ... " << flush;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   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 ) );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      if( ! grid. write( multiVector, outputFileName, outputFormat ) )
         return false;
   }
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( verbose )
      cout << "[ OK ].  \r";
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   return true;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
}

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;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   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" )
      indexType = parsedObjectType[ 3 ];
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed

   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" );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   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" );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed

   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 ... ";
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
         tnlList< tnlString > parsedObjectType;
         if( ! parseObjectType( objectType, parsedObjectType ) )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
            cerr << "Unable to parse object type " << objectType << "." << endl;
            return false;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
         setElementType< Mesh >( mesh, inputFiles[ i ], parsedObjectType, parameters );
   if( verbose )
      cout << endl;