Метис с Фортраном - PullRequest
       31

Метис с Фортраном

0 голосов
/ 16 ноября 2011

Я использую метис 5 с Фортраном. Я использую функцию 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.

P.S. Я использую Linux с компилятором pgf90 Fortran и использую следующую команду для компиляции и компоновки файла.

Pgf90 –o main main.f90 libmetis.a

Файл libmetis.a находится в том же каталоге, что и основной.

1 Ответ

3 голосов
/ 16 ноября 2011

Модуль Fortran 2003 ISO_C_BINDING определяет константу C_NULL_PTR, которая имеет тип типа (C_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

...