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

Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
#include <cstdlib>
#include <TNL/core/mfilename.h>
#include <TNL/Config/ParameterContainer.h>
#include <TNL/String.h>
#include <TNL/Vectors/Vector.h>
#include <TNL/Vectors/MultiVector.h>
#include <TNL/mesh/tnlGrid.h>
#include <TNL/Functions/MeshFunction.h>
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
using namespace std;
using namespace TNL;
bool getOutputFileName( const String& inputFileName,
                        const String& outputFormat,
                        String& outputFileName )
{
   outputFileName = inputFileName;
   RemoveFileExtension( outputFileName );
   if( outputFormat == "gnuplot" )
   {
      outputFileName += ".gplt";
      return true;
   }
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( outputFormat == "vtk" )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      outputFileName += ".vtk";
      return true;
   std::cerr << "Unknown file format " << outputFormat << ".";
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   return false;

template< typename MeshFunction >
bool writeMeshFunction( const typename MeshFunction::MeshPointer& meshPointer,
                        const String& inputFileName,
                        const Config::ParameterContainer& parameters  )
   MeshFunction function( meshPointer );
   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,
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< tnlGrid< 1, MeshReal, Devices::Host, MeshIndex > >& meshPointer,
                              const String& inputFileName,
                              const List< String >& parsedObjectType,
                              const Config::ParameterContainer& parameters )
   typedef tnlGrid< 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;
         return false;
}

template< typename MeshReal,
          typename MeshIndex >
bool setMeshEntityDimensions( const SharedPointer< tnlGrid< 2, MeshReal, Devices::Host, MeshIndex > >& meshPointer,
                              const String& inputFileName,
                              const List< String >& parsedObjectType,
                              const Config::ParameterContainer& parameters )
   typedef tnlGrid< 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< tnlGrid< 3, MeshReal, Devices::Host, MeshIndex > >& meshPointer,
                              const String& inputFileName,
                              const List< String >& parsedObjectType,
                              const Config::ParameterContainer& parameters )
   typedef tnlGrid< 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 );
         return setMeshEntityType< MeshPointer, 2 >( meshPointer, inputFileName, parsedObjectType, parameters );
         return setMeshEntityType< MeshPointer, 3 >( meshPointer, inputFileName, parsedObjectType, parameters );
         std::cerr << "Unsupported mesh functions entity dimensions count " << meshEntityDimensions << "." << std::endl;
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;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( verbose )
     std::cout << " writing to " << outputFileName << " ... " << std::flush;
   if( parsedObjectType[ 0 ] == "SharedVector" ||
       parsedObjectType[ 0 ] == "Vector" )
      Vectors::Vector< Element, Devices::Host, Index > vector;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      if( ! vector. load( inputFileName ) )
         return false;
      if( ! meshPointer->write( vector, outputFileName, outputFormat ) )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
         return false;
   }

   if( parsedObjectType[ 0 ] == "MultiVector" ||
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
       parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
   {
      Vectors::MultiVector< Dimensions, Element, Devices::Host, Index > multiVector;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      if( ! multiVector. load( inputFileName ) )
         return false;
      typedef tnlGrid< 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() ) );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      const Real spaceStep = grid. getSpaceSteps(). x();
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      if( ! grid. write( multiVector, outputFileName, outputFormat ) )
         return false;
   }
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   return true;
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 )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
{
   int dimensions( 0 );
   if( parsedObjectType[ 0 ] == "MultiVector" ||
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
       parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
      dimensions = atoi( parsedObjectType[ 1 ]. getString() );
   if( parsedObjectType[ 0 ] == "Vector" ||
       parsedObjectType[ 0 ] == "SharedVector" )
      dimensions = 1;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   switch( dimensions )
   {
      case 1:
         return convertObject< MeshPointer, Element, Real, Index, 1 >( meshPointer, inputFileName, parsedObjectType, parameters );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      case 2:
         return convertObject< MeshPointer, Element, Real, Index, 2 >( meshPointer, inputFileName, parsedObjectType, parameters );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      case 3:
         return convertObject< MeshPointer, Element, Real, Index, 3 >( meshPointer, inputFileName, parsedObjectType, parameters );
   std::cerr << "Cannot convert objects with " << dimensions << " dimensions." << std::endl;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   return false;
}

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 ] == "MultiVector" ||
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
       parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
      indexType = parsedObjectType[ 4 ];
   if( parsedObjectType[ 0 ] == "SharedVector" ||
       parsedObjectType[ 0 ] == "Vector" )
      indexType = parsedObjectType[ 3 ];
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed

   if( indexType == "int" )
      return setDimensions< MeshPointer, Element, Real, int >( meshPointer, inputFileName, parsedObjectType, parameters );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( indexType == "long-int" )
      return setDimensions< MeshPointer, Element, Real, long int >( meshPointer, inputFileName, parsedObjectType, parameters );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   cerr << "Unknown index type " << indexType << "." << endl;
   return false;
}

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, Vectors::StaticVector< 1, float >, float >( meshPointer, inputFileName, parsedObjectType, parameters );
            return setIndexType< MeshPointer, Vectors::StaticVector< 2, float >, float >( meshPointer, inputFileName, parsedObjectType, parameters );
            return setIndexType< MeshPointer, Vectors::StaticVector< 3, float >, float >( meshPointer, inputFileName, parsedObjectType, parameters );
            break;
      }
   if( dataType == "double" )
      switch( dimensions )
      {
         case 1:
            return setIndexType< MeshPointer, Vectors::StaticVector< 1, double >, double >( meshPointer, inputFileName, parsedObjectType, parameters );
            return setIndexType< MeshPointer, Vectors::StaticVector< 2, double >, double >( meshPointer, inputFileName, parsedObjectType, parameters );
            return setIndexType< MeshPointer, Vectors::StaticVector< 3, double >, double >( meshPointer, inputFileName, parsedObjectType, parameters );
            break;
      }
   if( dataType == "long double" )
      switch( dimensions )
      {
         case 1:
            return setIndexType< MeshPointer, Vectors::StaticVector< 1, long double >, long double >( meshPointer, inputFileName, parsedObjectType, parameters );
            return setIndexType< MeshPointer, Vectors::StaticVector< 2, long double >, long double >( meshPointer, inputFileName, parsedObjectType, parameters );
            return setIndexType< MeshPointer, Vectors::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 )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   // TODO: Fix this even for arrays
   if( parsedObjectType[ 0 ] == "MultiVector" ||
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
       parsedObjectType[ 0 ] == "tnlSharedMultiVector" )
      elementType = parsedObjectType[ 2 ];
   if( parsedObjectType[ 0 ] == "SharedVector" ||
       parsedObjectType[ 0 ] == "Vector" )
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
      elementType = parsedObjectType[ 1 ];

Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( elementType == "float" )
      return setIndexType< MeshPointer, float, float >( meshPointer, inputFileName, parsedObjectType, parameters );
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( elementType == "double" )
      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;
   if( parsedElementType[ 0 ] == "tnlStaticVector" )
      return setTupleType< MeshPointer >( meshPointer, inputFileName, parsedObjectType, parsedElementType, parameters );
   std::cerr << "Unknown element type " << elementType << "." << std::endl;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   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;
   
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
   if( meshFile != "" )
      if( ! meshPointer->load( meshFile ) )
         std::cerr << "I am not able to load mesh from the file " << meshFile << "." << std::endl;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
         return false;
      }
   meshPointer->writeMesh( "mesh.asy", "asymptote" );
   bool checkOutputFile = parameters. getParameter< bool >( "check-output-file" );
   List< String > inputFiles = parameters. getParameter< List< String > >( "input-files" );
   bool error( false );
//#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 ) )
      if( checkOutputFile && fileExists( outputFileName ) )
      {
         if( verbose )
           std::cout << " file already exists. Skipping.            \r" << std::flush;
      if( ! getObjectType( inputFiles[ i ], objectType ) )
          std::cerr << "unknown object ... SKIPPING!" << std::endl;
      else
      {
         if( verbose )
           std::cout << objectType << " detected ... ";
         List< String > parsedObjectType;
Tomáš Oberhuber's avatar
Tomáš Oberhuber committed
         if( ! parseObjectType( objectType, parsedObjectType ) )
            std::cerr << "Unable to parse object type " << objectType << "." << std::endl;
            error = true;
            continue;
         if( parsedObjectType[ 0 ] == "tnlMultiVector" ||
             parsedObjectType[ 0 ] == "tnlSharedMultiVector" ||      
             parsedObjectType[ 0 ] == "tnlSharedVector" ||
             parsedObjectType[ 0 ] == "tnlVector" )
            setElementType< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters );
         if( parsedObjectType[ 0 ] == "MeshFunction" )
            setMeshFunction< MeshPointer >( meshPointer, inputFiles[ i ], parsedObjectType, parameters );
           std::cout << "[ OK ].  " << std::endl;
   if( verbose )
     std::cout << std::endl;