0

我在Fortran中使用metis 5。我使用手冊中給出的簡單示例使用PartGraphRecursive函數。該代碼是作爲不是工作條件給出的。Metis和Fortran

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。

P.S.我正在使用Linux和pgf90 Fortran編譯器,我正在使用以下命令來編譯和鏈接文件。

Pgf90 –o main main.f90 libmetis.a 

libmetis.a文件與main位於同一目錄中。

回答

3

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 

你可以使用類型(c_ptr),值的所有參數,但你必須爲它們定義指針和使用功能C_LOC

+0

@弗拉基米爾˚F謝謝非常有幫助,現在示例代碼給出了一些合理的輸出。如果有人需要此代碼,請發送電子郵件至[email protected]。 –