Commit 39dc72b9 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Refactoring mesh type resolver using generic lambdas instead of variadic templates

parent 70756067
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ void export_Meshes( py::module & m )
    using Reader = TNL::Meshes::Readers::VTKReader;

    py::class_< Reader >( m, "VTKReader" )
        .def(py::init<>())
        .def(py::init<std::string>())
        .def("readMesh", &Reader::template readMesh< MeshOfEdges >)
        .def("readMesh", &Reader::template readMesh< MeshOfTriangles >)
        .def("readMesh", &Reader::template readMesh< MeshOfTetrahedrons >)
+106 −0
Original line number Diff line number Diff line
/***************************************************************************
                          loadDistributedMesh.h  -  description
                             -------------------
    begin                : Apr 9, 2020
    copyright            : (C) 2020 by Tomas Oberhuber et al.
    email                : tomas.oberhuber@fjfi.cvut.cz
 ***************************************************************************/

/* See Copyright Notice in tnl/Copyright */

#pragma once

#include <TNL/Meshes/Mesh.h>
#include <TNL/Meshes/DistributedMeshes/DistributedMesh.h>

namespace TNL {
namespace Meshes {

template< typename CommunicatorType,
          typename MeshConfig,
          typename Device >
bool
loadDistributedMesh( const String& fileName,
                     Mesh< MeshConfig, Device >& mesh,
                     DistributedMeshes::DistributedMesh< Mesh< MeshConfig, Device > >& distributedMesh )
{
   std::cerr << "Distributed Mesh is not supported yet, only Distributed Grid is supported.";
   return false;
}

template< typename Problem,
          typename MeshConfig,
          typename Device >
bool
decomposeMesh( const Config::ParameterContainer& parameters,
               const String& prefix,
               Mesh< MeshConfig, Device >& mesh,
               DistributedMeshes::DistributedMesh< Mesh< MeshConfig, Device > >& distributedMesh,
               Problem& problem )
{
   std::cerr << "Distributed Mesh is not supported yet, only Distributed Grid is supported.";
   return false;
}

// overloads for grids
template< typename CommunicatorType,
          int Dimension,
          typename Real,
          typename Device,
          typename Index >
bool
loadDistributedMesh( const String& fileName,
                     Grid< Dimension, Real, Device, Index >& mesh,
                     DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > &distributedMesh )
{
   std::cout << "Loading a global mesh from the file " << fileName << "...";
   Grid< Dimension, Real, Device, Index > globalGrid;
   try
   {
      globalGrid.load( fileName );
   }
   catch(...)
   {
      std::cerr << std::endl;
      std::cerr << "I am not able to load the global mesh from the file " << fileName << "." << std::endl;
      return false;
   }
   std::cout << " [ OK ] " << std::endl;

   typename Meshes::DistributedMeshes::DistributedMesh<Grid< Dimension, Real, Device, Index >>::SubdomainOverlapsType overlap;
   distributedMesh.template setGlobalGrid< CommunicatorType >( globalGrid );
   distributedMesh.setupGrid(mesh);
   return true;
}

template< typename Problem,
          int Dimension,
          typename Real,
          typename Device,
          typename Index >
bool
decomposeMesh( const Config::ParameterContainer& parameters,
               const String& prefix,
               Grid< Dimension, Real, Device, Index >& mesh,
               DistributedMeshes::DistributedMesh< Grid< Dimension, Real, Device, Index > > &distributedMesh,
               Problem& problem )
{
   using GridType = Grid< Dimension, Real, Device, Index >;
   using DistributedGridType = DistributedMeshes::DistributedMesh< GridType >;
   using SubdomainOverlapsType = typename DistributedGridType::SubdomainOverlapsType;
   using CommunicatorType = typename Problem::CommunicatorType;

   SubdomainOverlapsType lower( 0 ), upper( 0 );
   distributedMesh.setOverlaps( lower, upper );
   distributedMesh.setupGrid( mesh );

   problem.getSubdomainOverlaps( parameters, prefix, mesh, lower, upper  );
   distributedMesh.setOverlaps( lower, upper );
   distributedMesh.setupGrid( mesh );

   return true;
}


} // namespace Meshes
} // namespace TNL
+10 −4
Original line number Diff line number Diff line
@@ -30,10 +30,15 @@ namespace Readers {
class NetgenReader
{
public:
   bool detectMesh( const String& fileName )
   NetgenReader() = delete;

   NetgenReader( const String& fileName )
   : fileName( fileName )
   {}

   bool detectMesh()
   {
      this->reset();
      this->fileName = fileName;

      std::ifstream inputFile( fileName.getString() );
      if( ! inputFile )
@@ -146,13 +151,15 @@ public:
   }

   template< typename MeshType >
   static bool readMesh( const String& fileName, MeshType& mesh )
   bool readMesh( MeshType& mesh )
   {
      typedef typename MeshType::PointType PointType;
      typedef MeshBuilder< MeshType > MeshBuilder;

      const int dimension = PointType::getSize();

      // TODO: check that detectMesh has been called
      // TODO: reuse inputFile from the detectMesh method
      std::ifstream inputFile( fileName.getString() );
      if( ! inputFile )
      {
@@ -285,7 +292,6 @@ protected:

   void reset()
   {
      fileName = "";
      meshDimension = worldDimension = 0;
      cellShape = VTK::EntityShape::Vertex;
   }
+9 −5
Original line number Diff line number Diff line
@@ -21,11 +21,16 @@ namespace Readers {
class TNLReader
{
public:
   TNLReader() = delete;

   TNLReader( const String& fileName )
   : fileName( fileName )
   {}

   bool
   detectMesh( const String& fileName )
   detectMesh()
   {
      this->reset();
      this->fileName = fileName;

      const String objectType = getObjectType( fileName );
      const std::vector< String > parsedMeshType = parseObjectType( objectType );
@@ -94,8 +99,8 @@ public:
   }

   template< typename MeshType >
   static bool
   readMesh( const String& fileName, MeshType& mesh )
   bool
   readMesh( MeshType& mesh )
   {
      mesh.load( fileName );
      return true;
@@ -155,7 +160,6 @@ protected:

   void reset()
   {
      fileName = "";
      meshType = "";
      meshDimension = worldDimension = 0;
      cellShape = VTK::EntityShape::Vertex;
+10 −4
Original line number Diff line number Diff line
@@ -26,10 +26,15 @@ namespace Readers {
class VTKReader
{
public:
   bool detectMesh( const String& fileName )
   VTKReader() = delete;

   VTKReader( const String& fileName )
   : fileName( fileName )
   {}

   bool detectMesh()
   {
      this->reset();
      this->fileName = fileName;

      std::ifstream inputFile( fileName.getString() );
      if( ! inputFile ) {
@@ -149,7 +154,7 @@ public:
   }

   template< typename MeshType >
   bool readMesh( const String& fileName, MeshType& mesh )
   bool readMesh( MeshType& mesh )
   {
      using MeshBuilder = MeshBuilder< MeshType >;
      using IndexType = typename MeshType::GlobalIndexType;
@@ -159,6 +164,8 @@ public:
      const VTK::EntityShape cellType = VTK::TopologyToEntityShape< typename MeshType::template EntityTraits< MeshType::getMeshDimension() >::EntityTopology >::shape;
      MeshBuilder meshBuilder;

      // TODO: check that detectMesh has been called
      // TODO: reuse inputFile from the detectMesh method
      std::ifstream inputFile( fileName.getString() );
      if( ! inputFile ) {
         std::cerr << "Failed to open the file " << fileName << "." << std::endl;
@@ -348,7 +355,6 @@ protected:

   void reset()
   {
      fileName = "";
      meshDimension = worldDimension = 0;
      cellShape = VTK::EntityShape::Vertex;
      realType = "";
Loading