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

pytnl: added bindings for DistributedMesh and PVTU mesh reader

parent f30d68cf
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
add_subdirectory( tnl )
if( BUILD_MPI )
   add_subdirectory( tnl_mpi )
endif()

install( DIRECTORY . DESTINATION "include/pytnl"
         MESSAGE_NEVER
+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ set( sources
      Grid2D.cpp
      Grid3D.cpp
      Mesh.cpp
      MeshReaders.cpp
      Object.cpp
      SparseMatrix.cpp
      String.cpp
+0 −25
Original line number Diff line number Diff line
@@ -2,35 +2,10 @@
#include "../tnl_conversions.h"

#include "Mesh.h"
#include <TNL/Meshes/Readers/VTKReader.h>
#include <TNL/Meshes/Readers/VTUReader.h>

template< typename Reader >
void export_reader( py::module & m, const char* name )
{
    py::class_< Reader >( m, name )
        .def(py::init<std::string>())
        .def("loadMesh", &Reader::template loadMesh< MeshOfEdges >)
        .def("loadMesh", &Reader::template loadMesh< MeshOfTriangles >)
        .def("loadMesh", &Reader::template loadMesh< MeshOfTetrahedrons >)
//        .def("loadMesh", []( Reader& reader, const std::string& name, MeshOfEdges & mesh ) {
//                return reader.loadMesh( name.c_str(), mesh );
//            } )
//        .def("loadMesh", []( Reader& reader, const std::string& name, MeshOfTriangles & mesh ) {
//                return reader.loadMesh( name.c_str(), mesh );
//            } )
//        .def("loadMesh", []( Reader& reader, const std::string& name, MeshOfTetrahedrons & mesh ) {
//                return reader.loadMesh( name.c_str(), mesh );
//            } )
    ;
}

void export_Meshes( py::module & m )
{
    export_Mesh< MeshOfEdges >( m, "MeshOfEdges" );
    export_Mesh< MeshOfTriangles >( m, "MeshOfTriangles" );
    export_Mesh< MeshOfTetrahedrons >( m, "MeshOfTetrahedrons" );

    export_reader< TNL::Meshes::Readers::VTKReader >( m, "VTKReader" );
    export_reader< TNL::Meshes::Readers::VTUReader >( m, "VTUReader" );
}
+37 −0
Original line number Diff line number Diff line
// conversions have to be registered for each object file
#include "../tnl_conversions.h"

#include "MeshReaders.h"
#include "../typedefs.h"

void export_MeshReaders( py::module & m )
{
    using MeshReader = TNL::Meshes::Readers::MeshReader;
    using XMLVTK = TNL::Meshes::Readers::XMLVTK;

    // base class with trampolines for virtual methods
    py::class_< MeshReader, PyMeshReader >( m, "MeshReader" )
        .def(py::init<std::string>())
        // bindings against the actual class, NOT the trampoline
        .def("reset", &MeshReader::reset)
        .def("detectMesh", &MeshReader::detectMesh)
        .def("loadMesh", &MeshReader::template loadMesh< MeshOfEdges >)
        .def("loadMesh", &MeshReader::template loadMesh< MeshOfTriangles >)
        .def("loadMesh", &MeshReader::template loadMesh< MeshOfTetrahedrons >)
    ;

    py::class_< TNL::Meshes::Readers::VTKReader, MeshReader >( m, "VTKReader" )
        .def(py::init<std::string>())
    ;

    // base class for VTUReader and PVTUReader
    py::class_< XMLVTK, PyXMLVTK, MeshReader >( m, "XMLVTK" )
        .def(py::init<std::string>())
        .def("readPointData", &XMLVTK::readPointData)
        .def("readCellData", &XMLVTK::readCellData)
   ;

    py::class_< TNL::Meshes::Readers::VTUReader, XMLVTK >( m, "VTUReader" )
        .def(py::init<std::string>())
    ;
}
+47 −0
Original line number Diff line number Diff line
#include <TNL/Meshes/Readers/VTKReader.h>
#include <TNL/Meshes/Readers/VTUReader.h>

// trampoline classes needed for overriding virtual methods
// https://pybind11.readthedocs.io/en/stable/advanced/classes.html

class PyMeshReader
: public TNL::Meshes::Readers::MeshReader
{
   using Parent = TNL::Meshes::Readers::MeshReader;

public:
   // inherit constructors
   using TNL::Meshes::Readers::MeshReader::MeshReader;

   // trampolines (one for each virtual method)
   void reset() override
   {
      PYBIND11_OVERRIDE_PURE( void, Parent, reset );
   }

   void detectMesh() override
   {
      PYBIND11_OVERRIDE_PURE( void, Parent, detectMesh );
   }
};

class PyXMLVTK
: public TNL::Meshes::Readers::XMLVTK
{
   using Parent = TNL::Meshes::Readers::XMLVTK;

public:
   // inherit constructors
   using TNL::Meshes::Readers::XMLVTK::XMLVTK;

   // trampolines (one for each virtual method)
   void reset() override
   {
      PYBIND11_OVERRIDE_PURE( void, Parent, reset );
   }

   void detectMesh() override
   {
      PYBIND11_OVERRIDE_PURE( void, Parent, detectMesh );
   }
};
Loading