Метис с Фортраном
Я использую метис 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
call, так как большая часть ввода, который я хочу использовать, имеет значение NULL.
PS Я использую Linux с pgf90
Компилятор Fortran, и я использую следующую команду, чтобы скомпилировать и связать файл.
Pgf90 –o main main.f90 libmetis.a
Файл libmetis.a находится в том же каталоге, что и основной.
1 ответ
Модуль 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