【问题标题】:Using Boost Graph Library (BGL) in Fortran program在 Fortran 程序中使用 Boost Graph Library (BGL)
【发布时间】:2014-01-28 13:40:53
【问题描述】:

无论如何,我可以在我的 FORTRAN 程序中使用 Boost Graph Library (BGL) 来使用图形数据结构。

任何人都可以帮助我或给我一个提示。我想在我的 MPI-FORTRAN 代码中的几个处理器上做并行图结构。是否可以为此目的使用 Boost Graph Library (BGL)!

亲切的问候, 齐夫

【问题讨论】:

    标签: c++ boost fortran hybrid


    【解决方案1】:

    您必须构建一个中间层,用 C++ 编写,在某些对您有用的特殊情况下执行所有模板,然后从 Fortran 调用它。 bind(C)iso_c_binding 模块是你的朋友。我使用这种方法在 Fortran 中成功使用了基于 Boost 的库 CGAL。

    类似的东西:

    my_bgl.cc:

      #include <boost/graph/graph_traits.hpp>
      #include <boost/graph/adjacency_list.hpp>
    
      using namespace boost;
    extern "C"{  
      void* make_graph(int num_vertices, int num_edges, int *edge_array)
      {
    
        // create a typedef for the Graph type
        typedef adjacency_list<vecS, vecS, bidirectionalS> Graph;
    
        Graph *g = new Graph(num_vertices);
    
        // add the edges to the graph object
        for (int i = 0; i < num_edges; ++i)
          add_edge(edge_array[2*i], edge_array[2*i+1], *g);
    
        return g;
      }
    }
    

    my_bgl.f90:

    module my_bgl
      use iso_c_binding
    
      interface
        type(c_ptr) function make_graph(num_vertices, num_edges, edge_array) bind(C,name="make_graph")
          import
          integer(c_int), value :: num_vertices
          integer(c_int), value :: num_edges
          integer(c_int) :: edge_array(2, num_edges)
        end function
      end interface
    
    end module
    

    函数make_graph从输入的点返回一个指向图表的不透明指针。

    【讨论】:

    • 你能帮我一下,给我一些你是如何做到这一点的例子吗?在这方面我真的需要一些帮助。
    • 查看编辑以获取开始的示例。 (我使用了 BGL 教程中的示例代码。)
    • 最后一条评论,如果你坚持使用 Fortran 90(但我想你的意思是 95)并且不能使用 Fortran 2003,你可以保持 C++ 部分几乎相同,但你必须使用从 Fortran 调用 C 的旧的和不可移植的方法。但这也是可行的。
    • 不,我不坚持使用 FORTRAN 95,实际上我使用的是 FORTRAN 2003。在这种情况下,我还有什么需要知道的。无论如何,非常感谢您的帮助。
    【解决方案2】:

    不,boost 是一个 C++ 模板库。除非您将代码移植到 FORTRAN,否则这是不可能的。

    【讨论】:

    • 为什么? Fortran 和 C/C++ 对象模块可以被 gcc 或 Intel 编译器正确编译为可执行。
    • C++ 模板不直接编译为可执行代码,模板是用于代码生成的经过预处理的仅标头代码。请阅读en.wikipedia.org/wiki/Template_(C%2B%2B)
    • 当然您可以将模板代码编译为可执行代码,它仅限于您实际创建的对象的代码。 ;-)
    猜你喜欢
    • 2014-05-09
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多