From 644b6fc6af696692918fa649b91ada0dc21fc01a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= <klinkjak@fjfi.cvut.cz>
Date: Fri, 17 Feb 2017 22:33:31 +0100
Subject: [PATCH] Updated mesh type resolver for CUDA

---
 .../Meshes/TypeResolver/MeshTypeResolver.h    | 28 +++++++++----------
 .../TypeResolver/MeshTypeResolver_impl.h      | 10 +++----
 .../Meshes/TypeResolver/TypeResolver_impl.h   | 17 +++++++++--
 3 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/src/TNL/Meshes/TypeResolver/MeshTypeResolver.h b/src/TNL/Meshes/TypeResolver/MeshTypeResolver.h
index 3a13344dc7..cc23337c39 100644
--- a/src/TNL/Meshes/TypeResolver/MeshTypeResolver.h
+++ b/src/TNL/Meshes/TypeResolver/MeshTypeResolver.h
@@ -147,32 +147,32 @@ protected:
                                 ProblemSetterArgs&&... problemSetterArgs );
 
    // Overload for disabled mesh types
-   template< typename MeshType,
+   template< typename MeshConfig,
              typename = typename std::enable_if< ! BuildConfigTags::MeshDeviceTag< ConfigTag, Device >::enabled ||
                                                  ! BuildConfigTags::MeshTag< ConfigTag,
                                                                              Device,
-                                                                             typename MeshType::Config::CellTopology,
-                                                                             MeshType::Config::worldDimension,
-                                                                             typename MeshType::Config::RealType,
-                                                                             typename MeshType::Config::GlobalIndexType,
-                                                                             typename MeshType::Config::LocalIndexType,
-                                                                             typename MeshType::Config::IdType
+                                                                             typename MeshConfig::CellTopology,
+                                                                             MeshConfig::worldDimension,
+                                                                             typename MeshConfig::RealType,
+                                                                             typename MeshConfig::GlobalIndexType,
+                                                                             typename MeshConfig::LocalIndexType,
+                                                                             typename MeshConfig::IdType
                                                                            >::enabled >::type,
              typename = void >
    static bool resolveTerminate( Reader& reader,
                                  ProblemSetterArgs&&... problemSetterArgs );
 
    // Overload for enabled mesh types
-   template< typename MeshType,
+   template< typename MeshConfig,
              typename = typename std::enable_if< BuildConfigTags::MeshDeviceTag< ConfigTag, Device >::enabled &&
                                                  BuildConfigTags::MeshTag< ConfigTag,
                                                                              Device,
-                                                                             typename MeshType::Config::CellTopology,
-                                                                             MeshType::Config::worldDimension,
-                                                                             typename MeshType::Config::RealType,
-                                                                             typename MeshType::Config::GlobalIndexType,
-                                                                             typename MeshType::Config::LocalIndexType,
-                                                                             typename MeshType::Config::IdType
+                                                                             typename MeshConfig::CellTopology,
+                                                                             MeshConfig::worldDimension,
+                                                                             typename MeshConfig::RealType,
+                                                                             typename MeshConfig::GlobalIndexType,
+                                                                             typename MeshConfig::LocalIndexType,
+                                                                             typename MeshConfig::IdType
                                                                            >::enabled >::type >
    static bool resolveTerminate( Reader& reader,
                                  ProblemSetterArgs&&... problemSetterArgs );
diff --git a/src/TNL/Meshes/TypeResolver/MeshTypeResolver_impl.h b/src/TNL/Meshes/TypeResolver/MeshTypeResolver_impl.h
index 24a8514b03..c58c73cbf8 100644
--- a/src/TNL/Meshes/TypeResolver/MeshTypeResolver_impl.h
+++ b/src/TNL/Meshes/TypeResolver/MeshTypeResolver_impl.h
@@ -319,8 +319,7 @@ resolveMeshType( Reader& reader,
                  ProblemSetterArgs&&... problemSetterArgs )
 {
    using MeshConfig = typename BuildConfigTags::MeshConfigTemplateTag< ConfigTag >::template MeshConfig< CellTopology, WorldDimension, Real, GlobalIndex, LocalIndex, Id >;
-   using MeshType = Meshes::Mesh< MeshConfig >;
-   return resolveTerminate< MeshType >( reader, std::forward<ProblemSetterArgs>(problemSetterArgs)... );
+   return resolveTerminate< MeshConfig >( reader, std::forward<ProblemSetterArgs>(problemSetterArgs)... );
 }
 
 template< typename Reader,
@@ -328,14 +327,14 @@ template< typename Reader,
           typename Device,
           template< typename MeshType > class ProblemSetter,
           typename... ProblemSetterArgs >
-   template< typename MeshType,
+   template< typename MeshConfig,
              typename, typename >
 bool
 MeshTypeResolver< Reader, ConfigTag, Device, ProblemSetter, ProblemSetterArgs... >::
 resolveTerminate( Reader& reader,
                   ProblemSetterArgs&&... problemSetterArgs )
 {
-   std::cerr << "The mesh type " << TNL::getType< MeshType >() << " is disabled in the build configuration for device " << Device::getDeviceType() << "." << std::endl;
+   std::cerr << "The mesh config type " << TNL::getType< MeshConfig >() << " is disabled in the build configuration for device " << Device::getDeviceType() << "." << std::endl;
    return false;
 };
 
@@ -344,13 +343,14 @@ template< typename Reader,
           typename Device,
           template< typename MeshType > class ProblemSetter,
           typename... ProblemSetterArgs >
-   template< typename MeshType,
+   template< typename MeshConfig,
              typename >
 bool
 MeshTypeResolver< Reader, ConfigTag, Device, ProblemSetter, ProblemSetterArgs... >::
 resolveTerminate( Reader& reader,
                   ProblemSetterArgs&&... problemSetterArgs )
 {
+   using MeshType = Meshes::Mesh< MeshConfig, Device >;
    return ProblemSetter< MeshType >::run( std::forward<ProblemSetterArgs>(problemSetterArgs)... );
 };
 
diff --git a/src/TNL/Meshes/TypeResolver/TypeResolver_impl.h b/src/TNL/Meshes/TypeResolver/TypeResolver_impl.h
index f5576a7cee..d7f3e55768 100644
--- a/src/TNL/Meshes/TypeResolver/TypeResolver_impl.h
+++ b/src/TNL/Meshes/TypeResolver/TypeResolver_impl.h
@@ -111,9 +111,9 @@ bool resolveMeshType( const String& fileName_,
 }
 
 // TODO: reorganize
-template< typename Mesh >
+template< typename MeshConfig, typename Device >
 bool
-loadMesh( const String& fileName_, Mesh& mesh )
+loadMesh( const String& fileName_, Mesh< MeshConfig, Device >& mesh )
 {
    std::cout << "Loading mesh from file " << fileName_ << " ..." << std::endl;
    std::string fileName( fileName_.getString() );
@@ -139,12 +139,23 @@ loadMesh( const String& fileName_, Mesh& mesh )
       std::cerr << "I am not able to load the mesh from the file " << fileName_ << ". "
                    "Perhaps the mesh stored in the file is not supported by the mesh "
                    "passed to the loadMesh function? The mesh type is "
-                << Mesh::getType() << std::endl;
+                << mesh.getType() << std::endl;
       return false;
    }
    return true;
 }
 
+template< typename MeshConfig >
+bool
+loadMesh( const String& fileName, Mesh< MeshConfig, Devices::Cuda >& mesh )
+{
+   Mesh< MeshConfig, Devices::Host > hostMesh;
+   if( ! loadMesh( fileName, hostMesh ) )
+      return false;
+   mesh = hostMesh;
+   return true;
+}
+
 template< int Dimension, typename Real, typename Device, typename Index >
 bool
 loadMesh( const String& fileName, Grid< Dimension, Real, Device, Index >& mesh )
-- 
GitLab