Commit c8e36b9b authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

update for new TNL - refactored Benchmarks interface and Mesh configuration

parent e36cc5a1
Loading
Loading
Loading
Loading
+31 −31
Original line number Original line Diff line number Diff line
@@ -76,17 +76,17 @@ struct MeshBenchmarks
{
{
   static_assert( std::is_same< typename Mesh::DeviceType, Devices::Host >::value, "The mesh should be loaded on the host." );
   static_assert( std::is_same< typename Mesh::DeviceType, Devices::Host >::value, "The mesh should be loaded on the host." );


   static bool run( Benchmark & benchmark, const Config::ParameterContainer & parameters )
   static bool run( Benchmark<> & benchmark, const Config::ParameterContainer & parameters )
   {
   {
      // initialization is done at compile-time! (we can't access Mesh::Config::worldDimension at run-time because of linker errors)
      // initialization is done at compile-time! (we can't access Mesh::Config::spaceDimension at run-time because of linker errors)
      // TODO: fix this! (e.g. make Mesh::getWorldDimension() method)
      // TODO: fix this! (e.g. make Mesh::getSpaceDimension() method)
//      constexpr int worldDimension = Mesh::Config::worldDimension;
//      constexpr int spaceDimension = Mesh::Config::spaceDimension;


      Benchmark::MetadataColumns metadataColumns = {
      Logging::MetadataColumns metadataColumns = {
//         {"mesh-file", meshFile},
//         {"mesh-file", meshFile},
         {"config", Mesh::Config::getConfigType()},
         {"config", Mesh::Config::getConfigType()},
         {"topology", getType< typename Mesh::Config::CellTopology >().replace("Topologies::", "")},
         {"topology", getType< typename Mesh::Config::CellTopology >().replace("Topologies::", "")},
//         {"wrld dim", worldDimension},
//         {"space dim", spaceDimension},
         {"real", getType< typename Mesh::RealType >()},
         {"real", getType< typename Mesh::RealType >()},
         {"gid_t", getType< typename Mesh::GlobalIndexType >()},
         {"gid_t", getType< typename Mesh::GlobalIndexType >()},
         {"lid_t", getType< typename Mesh::LocalIndexType >()},
         {"lid_t", getType< typename Mesh::LocalIndexType >()},
@@ -139,7 +139,7 @@ struct MeshBenchmarks
      return true;
      return true;
   }
   }


   static void dispatchAlgorithms( Benchmark & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh )
   static void dispatchAlgorithms( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh )
   {
   {
      Algorithms::staticFor< int, 1, Mesh::getMeshDimension() + 1 >(
      Algorithms::staticFor< int, 1, Mesh::getMeshDimension() + 1 >(
            [&] ( auto dim ) {
            [&] ( auto dim ) {
@@ -159,8 +159,8 @@ struct MeshBenchmarks
   struct CentersDispatch
   struct CentersDispatch
   {
   {
      template< typename M,
      template< typename M,
                typename = typename std::enable_if< M::Config::subentityStorage( typename M::Config::CellTopology{}, 0 ) >::type >
                typename = typename std::enable_if< M::Config::subentityStorage( M::getMeshDimension(), 0 ) >::type >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
         benchmark.setOperation( String("Centers (d = ") + convertToString(EntityDimension) + ")" );
         benchmark.setOperation( String("Centers (d = ") + convertToString(EntityDimension) + ")" );
         benchmark_centers< EntityDimension, Devices::Host >( benchmark, parameters, mesh );
         benchmark_centers< EntityDimension, Devices::Host >( benchmark, parameters, mesh );
@@ -170,9 +170,9 @@ struct MeshBenchmarks
      }
      }


      template< typename M,
      template< typename M,
                typename = typename std::enable_if< ! M::Config::subentityStorage( typename M::Config::CellTopology{}, 0 ) >::type,
                typename = typename std::enable_if< ! M::Config::subentityStorage( M::getMeshDimension(), 0 ) >::type,
                typename = void >
                typename = void >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
      }
      }
   };
   };
@@ -181,8 +181,8 @@ struct MeshBenchmarks
   struct MeasuresDispatch
   struct MeasuresDispatch
   {
   {
      template< typename M,
      template< typename M,
                typename = typename std::enable_if< M::Config::subentityStorage( typename M::Config::CellTopology{}, 0 ) >::type >
                typename = typename std::enable_if< M::Config::subentityStorage( M::getMeshDimension(), 0 ) >::type >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
         benchmark.setOperation( String("Measures (d = ") + convertToString(EntityDimension) + ")" );
         benchmark.setOperation( String("Measures (d = ") + convertToString(EntityDimension) + ")" );
         benchmark_measures< EntityDimension, Devices::Host >( benchmark, parameters, mesh );
         benchmark_measures< EntityDimension, Devices::Host >( benchmark, parameters, mesh );
@@ -192,9 +192,9 @@ struct MeshBenchmarks
      }
      }


      template< typename M,
      template< typename M,
                typename = typename std::enable_if< ! M::Config::subentityStorage( typename M::Config::CellTopology{}, 0 ) >::type,
                typename = typename std::enable_if< ! M::Config::subentityStorage( M::getMeshDimension(), 0 ) >::type,
                typename = void >
                typename = void >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
      }
      }
   };
   };
@@ -207,7 +207,7 @@ struct MeshBenchmarks
                              std::is_same< typename M::Config::CellTopology, Topologies::Triangle >::value ||
                              std::is_same< typename M::Config::CellTopology, Topologies::Triangle >::value ||
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                           >::type >
                           >::type >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
         benchmark.setOperation( "Dual M" );
         benchmark.setOperation( "Dual M" );
         benchmark_dual_measures< Devices::Host >( benchmark, parameters, mesh );
         benchmark_dual_measures< Devices::Host >( benchmark, parameters, mesh );
@@ -223,7 +223,7 @@ struct MeshBenchmarks
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                           ) >::type,
                           ) >::type,
                typename = void >
                typename = void >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
      }
      }
   };
   };
@@ -235,7 +235,7 @@ struct MeshBenchmarks
                              std::is_same< typename M::Config::CellTopology, Topologies::Triangle >::value ||
                              std::is_same< typename M::Config::CellTopology, Topologies::Triangle >::value ||
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                           >::type >
                           >::type >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
         benchmark.setOperation( "Spheres" );
         benchmark.setOperation( "Spheres" );
         benchmark_spheres< Devices::Host >( benchmark, parameters, mesh );
         benchmark_spheres< Devices::Host >( benchmark, parameters, mesh );
@@ -250,13 +250,13 @@ struct MeshBenchmarks
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                              std::is_same< typename M::Config::CellTopology, Topologies::Tetrahedron >::value
                           ) >::type,
                           ) >::type,
                typename = void >
                typename = void >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      static void exec( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
      {
      }
      }
   };
   };


   template< int EntityDimension, typename Device >
   template< int EntityDimension, typename Device >
   static void benchmark_centers( Benchmark & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   static void benchmark_centers( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   {
   {
      using Real = typename Mesh::RealType;
      using Real = typename Mesh::RealType;
      using Index = typename Mesh::GlobalIndexType;
      using Index = typename Mesh::GlobalIndexType;
@@ -301,7 +301,7 @@ struct MeshBenchmarks
   }
   }


   template< int EntityDimension, typename Device >
   template< int EntityDimension, typename Device >
   static void benchmark_measures( Benchmark & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   static void benchmark_measures( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   {
   {
      using Real = typename Mesh::RealType;
      using Real = typename Mesh::RealType;
      using Index = typename Mesh::GlobalIndexType;
      using Index = typename Mesh::GlobalIndexType;
@@ -345,7 +345,7 @@ struct MeshBenchmarks
   }
   }


   template< typename Device >
   template< typename Device >
   static void benchmark_dual_measures( Benchmark & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   static void benchmark_dual_measures( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   {
   {
      static_assert( std::is_same< typename Mesh::Config::CellTopology, Topologies::Edge >::value ||
      static_assert( std::is_same< typename Mesh::Config::CellTopology, Topologies::Edge >::value ||
                     std::is_same< typename Mesh::Config::CellTopology, Topologies::Triangle >::value ||
                     std::is_same< typename Mesh::Config::CellTopology, Topologies::Triangle >::value ||
@@ -416,7 +416,7 @@ struct MeshBenchmarks
   }
   }


   template< typename Device >
   template< typename Device >
   static void benchmark_spheres( Benchmark & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   static void benchmark_spheres( Benchmark<> & benchmark, const Config::ParameterContainer & parameters, const Mesh & mesh_src )
   {
   {
      static_assert( std::is_same< typename Mesh::Config::CellTopology, Topologies::Triangle >::value ||
      static_assert( std::is_same< typename Mesh::Config::CellTopology, Topologies::Triangle >::value ||
                     std::is_same< typename Mesh::Config::CellTopology, Topologies::Tetrahedron >::value,
                     std::is_same< typename Mesh::Config::CellTopology, Topologies::Tetrahedron >::value,
@@ -495,7 +495,7 @@ struct MeshBenchmarks


template< template< typename, int, typename, typename, typename > class ConfigTemplate,
template< template< typename, int, typename, typename, typename > class ConfigTemplate,
          typename CellTopology,
          typename CellTopology,
          int WorldDimension,
          int SpaceDimension,
          typename Real,
          typename Real,
          typename GlobalIndex,
          typename GlobalIndex,
          typename LocalIndex >
          typename LocalIndex >
@@ -506,24 +506,24 @@ struct MeshBenchmarksRunner
    // otherwise the compiler would always do implicit instead of explicit
    // otherwise the compiler would always do implicit instead of explicit
    // instantiation.
    // instantiation.
    static bool
    static bool
    run( Benchmark & benchmark,
    run( Benchmark<> & benchmark,
         Benchmark::MetadataMap metadata,
         Benchmark<>::MetadataMap metadata,
         const Config::ParameterContainer & parameters );
         const Config::ParameterContainer & parameters );
};
};


template< template< typename, int, typename, typename, typename > class ConfigTemplate,
template< template< typename, int, typename, typename, typename > class ConfigTemplate,
          typename CellTopology,
          typename CellTopology,
          int WorldDimension,
          int SpaceDimension,
          typename Real,
          typename Real,
          typename GlobalIndex,
          typename GlobalIndex,
          typename LocalIndex >
          typename LocalIndex >
bool
bool
MeshBenchmarksRunner< ConfigTemplate,  CellTopology, WorldDimension, Real, GlobalIndex, LocalIndex >::
MeshBenchmarksRunner< ConfigTemplate,  CellTopology, SpaceDimension, Real, GlobalIndex, LocalIndex >::
run( Benchmark & benchmark,
run( Benchmark<> & benchmark,
     Benchmark::MetadataMap metadata,
     Benchmark<>::MetadataMap metadata,
     const Config::ParameterContainer & parameters )
     const Config::ParameterContainer & parameters )
{
{
   using Config = ConfigTemplate< CellTopology, WorldDimension, Real, GlobalIndex, LocalIndex >;
   using Config = ConfigTemplate< CellTopology, SpaceDimension, Real, GlobalIndex, LocalIndex >;
   using MeshType = Mesh< Config, Devices::Host >;
   using MeshType = Mesh< Config, Devices::Host >;
   return MeshBenchmarks< MeshType >::run( benchmark, parameters );
   return MeshBenchmarks< MeshType >::run( benchmark, parameters );
}
}
+14 −41
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@
#include <TNL/Meshes/Topologies/SubentityVertexMap.h>
#include <TNL/Meshes/Topologies/SubentityVertexMap.h>


template< typename Cell,
template< typename Cell,
          int WorldDimension = Cell::dimension,
          int SpaceDimension = Cell::dimension,
          typename Real = double,
          typename Real = double,
          typename GlobalIndex = int,
          typename GlobalIndex = int,
          typename LocalIndex = GlobalIndex >
          typename LocalIndex = GlobalIndex >
@@ -27,7 +27,7 @@ struct FullConfig
   using GlobalIndexType = GlobalIndex;
   using GlobalIndexType = GlobalIndex;
   using LocalIndexType = LocalIndex;
   using LocalIndexType = LocalIndex;


   static constexpr int worldDimension = WorldDimension;
   static constexpr int spaceDimension = SpaceDimension;
   static constexpr int meshDimension = Cell::dimension;
   static constexpr int meshDimension = Cell::dimension;


   static TNL::String getConfigType()
   static TNL::String getConfigType()
@@ -38,27 +38,15 @@ struct FullConfig
   /****
   /****
    * Storage of subentities of mesh entities.
    * Storage of subentities of mesh entities.
    */
    */
   template< typename EntityTopology >
   static constexpr bool subentityStorage( int entityDimension, int subentityDimension )
   static constexpr bool subentityStorage( EntityTopology, int SubentityDimension )
   {
   {
      return true;
      return true;
   }
   }


   /****
    * Storage of subentity orientations of mesh entities.
    * It must be false for vertices and cells.
    */
   template< typename EntityTopology >
   static constexpr bool subentityOrientationStorage( EntityTopology, int SubentityDimension )
   {
      return false;
   }

   /****
   /****
    * Storage of superentities of mesh entities.
    * Storage of superentities of mesh entities.
    */
    */
   template< typename EntityTopology >
   static constexpr bool superentityStorage( int entityDimension, int superentityDimension )
   static constexpr bool superentityStorage( EntityTopology, int SuperentityDimension )
   {
   {
      return true;
      return true;
   }
   }
@@ -66,8 +54,7 @@ struct FullConfig
   /****
   /****
    * Storage of mesh entity tags. Boundary tags are necessary for the mesh traverser.
    * Storage of mesh entity tags. Boundary tags are necessary for the mesh traverser.
    */
    */
   template< typename EntityTopology >
   static constexpr bool entityTagsStorage( int entityDimension )
   static constexpr bool entityTagsStorage( EntityTopology )
   {
   {
      return true;
      return true;
   }
   }
@@ -90,7 +77,7 @@ struct FullConfig
};
};


template< typename Cell,
template< typename Cell,
          int WorldDimension = Cell::dimension,
          int SpaceDimension = Cell::dimension,
          typename Real = double,
          typename Real = double,
          typename GlobalIndex = int,
          typename GlobalIndex = int,
          typename LocalIndex = GlobalIndex >
          typename LocalIndex = GlobalIndex >
@@ -101,7 +88,7 @@ struct MinimalConfig
   using GlobalIndexType = GlobalIndex;
   using GlobalIndexType = GlobalIndex;
   using LocalIndexType = LocalIndex;
   using LocalIndexType = LocalIndex;


   static constexpr int worldDimension = WorldDimension;
   static constexpr int spaceDimension = SpaceDimension;
   static constexpr int meshDimension = Cell::dimension;
   static constexpr int meshDimension = Cell::dimension;


   static TNL::String getConfigType()
   static TNL::String getConfigType()
@@ -112,42 +99,28 @@ struct MinimalConfig
   /****
   /****
    * Storage of subentities of mesh entities.
    * Storage of subentities of mesh entities.
    */
    */
   template< typename EntityTopology >
   static constexpr bool subentityStorage( int entityDimension, int subentityDimension )
   static constexpr bool subentityStorage( EntityTopology, int SubentityDimension )
   {
      return SubentityDimension == 0 || ( SubentityDimension == meshDimension - 1 && EntityTopology::dimension == meshDimension );
   }

   /****
    * Storage of subentity orientations of mesh entities.
    * It must be false for vertices and cells.
    */
   template< typename EntityTopology >
   static constexpr bool subentityOrientationStorage( EntityTopology, int SubentityDimension )
   {
   {
      return false;
      return subentityDimension == 0 || ( subentityDimension == meshDimension - 1 && entityDimension == meshDimension );
   }
   }


   /****
   /****
    * Storage of superentities of mesh entities.
    * Storage of superentities of mesh entities.
    */
    */
   template< typename EntityTopology >
   static constexpr bool superentityStorage( int entityDimension, int superentityDimension )
   static constexpr bool superentityStorage( EntityTopology, int SuperentityDimension )
   {
   {
      return ( EntityTopology::dimension == 0 || EntityTopology::dimension == meshDimension - 1 ) && SuperentityDimension == meshDimension;
      return ( entityDimension == 0 || entityDimension == meshDimension - 1 ) && superentityDimension == meshDimension;
   }
   }


   /****
   /****
    * Storage of mesh entity tags. Boundary tags are necessary for the mesh traverser.
    * Storage of mesh entity tags. Boundary tags are necessary for the mesh traverser.
    */
    */
   template< typename EntityTopology >
   static constexpr bool entityTagsStorage( int entityDimension )
   static constexpr bool entityTagsStorage( EntityTopology )
   {
   {
//      return false;
//      return false;
       // NOTE: needed for reorderEntities (could be optimized)
       // NOTE: needed for reorderEntities (could be optimized)
      using FaceTopology = typename TNL::Meshes::Topologies::Subtopology< CellTopology, meshDimension - 1 >::Topology;
      return superentityStorage( meshDimension - 1, meshDimension ) &&
      return superentityStorage( FaceTopology(), meshDimension ) &&
             ( entityDimension >= meshDimension - 1 || subentityStorage( meshDimension - 1, entityDimension ) );
             ( EntityTopology::dimension >= meshDimension - 1 || subentityStorage( FaceTopology(), EntityTopology::dimension ) );
   }
   }


   /****
   /****
Compare bc4c3e2f to 5bf2e24d
Original line number Original line Diff line number Diff line
Subproject commit bc4c3e2f7e7d9ca3960037c272e4b5b11828fe6f
Subproject commit 5bf2e24da5c24c7bb2aac59685b4916e4487657b
+21 −21
Original line number Original line Diff line number Diff line
@@ -24,33 +24,33 @@ using namespace TNL::Meshes;
using namespace TNL::Benchmarks;
using namespace TNL::Benchmarks;


template< typename CellTopology,
template< typename CellTopology,
          int WorldDimension = CellTopology::dimension,
          int SpaceDimension = CellTopology::dimension,
          typename... Params >
          typename... Params >
bool
bool
setMeshParameters( Params&&... params )
setMeshParameters( Params&&... params )
{
{
   bool status = MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, float, int, short int >::run( std::forward<Params>(params)... ) &&
   bool status = MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, float, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, float, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, float, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, float, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, float, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, float, long int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, float, long int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, double, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, double, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, double, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, double, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, double, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, double, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, WorldDimension, double, long int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< MinimalConfig, CellTopology, SpaceDimension, double, long int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, float, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, float, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, float, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, float, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, float, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, float, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, float, long int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, float, long int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, double, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, double, int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, double, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, double, int, int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, double, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, double, long int, short int >::run( std::forward<Params>(params)... ) &&
                 MeshBenchmarksRunner< FullConfig, CellTopology, WorldDimension, double, long int, int >::run( std::forward<Params>(params)... );
                 MeshBenchmarksRunner< FullConfig, CellTopology, SpaceDimension, double, long int, int >::run( std::forward<Params>(params)... );
   return status;
   return status;
}
}


bool
bool
resolveCellTopology( Benchmark & benchmark,
resolveCellTopology( Benchmark<> & benchmark,
                     Benchmark::MetadataMap metadata,
                     Logging::MetadataMap metadata,
                     const Config::ParameterContainer & parameters )
                     const Config::ParameterContainer & parameters )
{
{
   const String & meshFile = parameters.getParameter< String >( "mesh-file" );
   const String & meshFile = parameters.getParameter< String >( "mesh-file" );
@@ -131,10 +131,10 @@ main( int argc, char* argv[] )
   std::ofstream logFile( logFileName.getString(), mode );
   std::ofstream logFile( logFileName.getString(), mode );


   // init benchmark and common metadata
   // init benchmark and common metadata
   Benchmark benchmark( loops, verbose );
   Benchmark<> benchmark( loops, verbose );


   // prepare global metadata
   // prepare global metadata
   Benchmark::MetadataMap metadata = getHardwareMetadata();
   Logging::MetadataMap metadata = getHardwareMetadata();


   if( ! resolveCellTopology( benchmark, metadata, parameters ) )
   if( ! resolveCellTopology( benchmark, metadata, parameters ) )
      return EXIT_FAILURE;
      return EXIT_FAILURE;