【问题标题】:Metis with Fortran使用 Fortran 的 Metis
【发布时间】:2011-11-16 16:30:59
【问题描述】:

我将 metis 5 与 Fortran 一起使用。我正在使用PartGraphRecursive 函数和手册中给出的简单示例。给出的代码不是工作条件。

program main    
implicit none     
integer,parameter::nvtxs=15, Edges=22

integer::xadj(nvtxs+1),adjncy(2*Edges)    
integer::objval, part(nvtxs)

xadj=[0, 2, 5, 8, 11, 13, 16, 20, 24, 28, 31, 33, 36, 39, 42, 44]    
adjncy=[1, 5, 0, 2, 6, 1, 3, 7, 2, 4, 8, 3, 9, 0, 6, 10, 1, 5, 7, 11, 2, 6, 8, 12, 3, 7, 9, 13, 4, 8, 14, 5, 11, 6, 10, 12, 7, 11, 13, 8, 12, 14, 9, 13]

call METIS_PartGraphRecursive(vortices,1,xadj,adjncy,,,,2,,,,objval,part)

end program main

任何人都可以完成此代码吗?我不太清楚如何使用 METIS_PartGraphRecursive 调用的不同输入,因为我想使用的大多数输入都是 NULL。

附:我正在使用带有pgf90 Fortran 编译器的 Linux,并且我正在使用以下命令来编译和链接文件。

Pgf90 –o main main.f90 libmetis.a

libmetis.a 文件与 main 位于同一目录中。

【问题讨论】:

    标签: parallel-processing fortran task-parallel-library mpi fortran-iso-c-binding


    【解决方案1】:

    Fortran 2003 模块ISO_C_BINDING 定义了一个类型为(C_PTR) 的常量C_NULL_PTR。您可以使用此模块定义子程序的接口。

    应该是这样的

    interface
    
     subroutine METIS_PartGraphRecursive(n,xadj,adjncy,vwght,adjwgt,wgtflag,numflag,nparts,options,edgecut,part) bind(C)
    
       use iso_c_binding
    
       integer(c_int) :: !here the parameters you pass as integers
       type(c_ptr),value :: !here the parameters you want to pass c_null_ptr to
     end subroutine
    
    endinterface
    

    您可以对所有参数使用 type(c_ptr),value,但您必须为它们定义指针并使用函数 C_LOC

    【讨论】:

    • @Vladimir F 非常感谢,它真的很有帮助,现在示例代码给出了一些合理的输出。如果有人需要此代码,请发送电子邮件至 zahoorswati@hotmail.com。
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2018-02-07
    • 2012-09-19
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多